题意:给出m个n的全排列,求一个n的全排列,满足对于i<j,至少存在一半的全排列中,ai排在aj的前面,求字典序最小方案,或者是无解。

(1)首先我们对 vis[ a[i] ][ a[j] ]++ ,求出a[i] 对 a[j] 的贡献。对vis[i][j] 和 vis[j][i]是否大于 一半 ,若大于就建立一条边,最后跑一边拓扑排序

(2)比赛的时候,将大于j 的数插入 s[j] 的集合中,然后对每一位进行筛选,若当前位置的数没有比他大的,则当前位置的数就为该数,然后将这个数从s[i] (i = 1 - > n)中删除这个数

依次循环,算的时间复杂度是0(k*n*n + n*n*log(n)),没想到超时了

比赛结束后,改成用树状数组维护,AC  ....  没想到STL 时间复杂度真的是高

拓扑排序 AC code

#include <bits/stdc++.h>using namespace std;const int N = 1e3 + 10;int vis[N][N],a[N],in[N],ans[N],n;vector<int>edge[N];int topu()
{int cont=0;priority_queue<int,vector<int>,greater<int> >Q;for(int i=1; i<=n; i++)if(in[i]==0)Q.push(i);while(!Q.empty()){int u=Q.top();Q.pop();cont++;ans[cont] = u;for(int i = 0 ;i < edge[u].size(); i++){int v = edge[u][i];if(--in[v]==0)Q.push(v);}}if(cont<n)return false;return true;
}
int main()
{int m;while(~scanf("%d%d",&n,&m)&&n&&m){memset(vis,0,sizeof(vis));memset(in,0,sizeof(in));for(int i = 1;i <= m;i++){for(int j = 1;j <= n;j++)scanf("%d",&a[j]);for(int j = 1;j <= n;j++)for(int k = j+1;k <= n;k++)vis[a[j]][a[k]]++;}for(int i = 1; i <= n;i++)for(int j = i + 1;j <= n;j++){if(vis[i][j] > vis[j][i])   edge[i].push_back(j),in[j]++;else if(vis[i][j] < vis[j][i])  edge[j].push_back(i),in[i]++;}if(topu()){for(int i = 1;i <= n;i++)printf("%d%c",ans[i],i == n?'\n':' ');}elseputs("No solution");for(int i = 1;i <= n;i++)edge[i].clear();}return 0;
}

set超时代码:

#include <bits/stdc++.h>using namespace std;const int N = 1e3 + 10;int vis[N][N],a[N],vised[N];
set<int>s[N];
int main()
{int n,m;while(~scanf("%d%d",&n,&m)&&n&&m){for (int i=1;i<=n;i++)s[i].clear();memset(vis,0,sizeof(vis));memset(vised,0,sizeof(vised));for(int i = 1;i <= m;i++){for(int j = 1;j <= n;j++)scanf("%d",&a[j]);for(int j = 1;j <= n;j++)for(int k = j+1;k <= n;k++)vis[a[j]][a[k]]++;}for(int i = 1; i <= n;i++)for(int j = i + 1;j <= n;j++){if(vis[i][j] > m/2) vis[i][j] = 1,vis[j][i] = 0,s[j].insert(i);else if(vis[j][i] > m/2) vis[j][i] = 1,vis[i][j] = 0,s[i].insert(j);else    vis[i][j] = vis[j][i] = 0;}int ans[N],tot = 1;while(tot <= n){int flag = 0,now = 0;for(int i = 1;i <= n;i++){if(!vised[i]){if(s[i].empty()){flag = 1;now = i;break;}}}if(!flag)   break;ans[tot] = now;vised[now] = 1;for(int i = 1;i <= n;i++)if(s[i].find(now) != s[i].end())s[i].erase(s[i].find(now));tot++;}if(tot <= n)    puts("No solution");else{for(int i = 1;i <= n;i++)printf("%d%c",ans[i],i == n?'\n':' ');}}return 0;
}

树状数组AC code:

#include <bits/stdc++.h>
#define IT set<int>::iteratorusing namespace std;const int N = 1e3 + 10;int vis[N][N],a[N],vised[N],c[N][N],n;int lowbit(int x){  return x&(-x);}
void update(int pos,int x,int y)
{while(x <= n){c[pos][x] += y;x += lowbit(x);}
}int query(int pos,int x)
{int ans = 0;while(x){ans += c[pos][x];x -= lowbit(x);}return ans;
}
int main()
{int m;while(~scanf("%d%d",&n,&m)&&n&&m){memset(c,0,sizeof(c));memset(vis,0,sizeof(vis));memset(vised,0,sizeof(vised));for(int i = 1;i <= m;i++){for(int j = 1;j <= n;j++)scanf("%d",&a[j]);for(int j = 1;j <= n;j++)for(int k = j+1;k <= n;k++)vis[a[j]][a[k]]++;}for(int i = 1; i <= n;i++)for(int j = i + 1;j <= n;j++){if(vis[i][j] > vis[j][i])   vis[i][j] = 1,vis[j][i] = 0,update(j,i,1);else if(vis[j][i] > vis[i][j]) vis[j][i] = 1,vis[i][j] = 0,update(i,j,1);else vis[i][j] = vis[j][i] = 0;}int ans[N],tot = 1;while(tot <= n){int flag = 0,now = 0;for(int i = 1;i <= n;i++){if(!vised[i]){if(!query(i,n)){flag = 1;now = i;break;}}}if(!flag)   break;ans[tot] = now;vised[now] = 1;for(int i = 1;i <= n;i++){if(vis[now][i])update(i,now,-1);}tot++;}if(tot <= n)    puts("No solution");else{for(int i = 1;i <= n;i++)printf("%d%c",ans[i],i == n?'\n':' ');}}return 0;
}

转载于:https://www.cnblogs.com/lemon-jade/p/9600802.html

MicroRNA Ranking(Tehran2016)相关推荐

  1. Programming Contest Ranking(题解)

    Programming Contest Ranking . 题目描述 Heilongjiang Programming Contest will end successfully! And your ...

  2. NLP︱高级词向量表达(三)——WordRank(简述)

    如果说FastText的词向量在表达句子时候很在行的话,GloVe在多义词方面表现出色,那么wordRank在相似词寻找方面表现地不错. 其是通过Robust Ranking来进行词向量定义. 相关p ...

  3. Learning to Rank基于pairwise的算法(一)——Ranking SVM、MHR、IRSVM

    1.概述 对于搜索任务来说,系统接收到用户查询之后,返回相关文档列表.所以问题的关键是确定文档之间的先后顺序,而pairwise则将重点转向对文档关系是否合理的判断. 在pairwise中,排序算法通 ...

  4. 梯度提升决策树(GBDT)与XGBoost、LightGBM

    20211224 [机器学习算法总结]XGBoost_yyy430的博客-CSDN博客_xgboost xgboost参数 默认:auto.XGBoost中使用的树构造算法.可选项:auto,exac ...

  5. 最新!TUI世界大学排名(2021)发布:清华位居全球前20名!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨双一流高校 编辑丨极市平台 导读 南方教育智库大学第三方评价课 ...

  6. 【高薪】阿联酋起源人工智能研究院诚邀优秀人才(博士)

    来源:起源人工智能研究院 起源人工智能研究院简介 2018年初,起源人工智能研究院 (IIAI, Inception Institute of Artificial Intelligence)于阿联酋 ...

  7. ACM题集以及各种总结大全(转)

    ACM题集以及各种总结大全! 虽然退役了,但是整理一下,供小弟小妹们以后切题方便一些,但由于近来考试太多,顾退役总结延迟一段时间再写!先写一下各种分类和题集,欢迎各位大牛路过指正. 一.ACM入门 关 ...

  8. 你应该在开始API开发之前知道的事(下)(翻译)

    放了十多天,一直在玩没写,今天终于要把坑填完了.有部分没翻,主要是一般都用不上的,有兴趣的朋友可以自己翻下. 上篇地址 :http://www.cnblogs.com/Scohura/p/357360 ...

  9. 常用巡检语句(oracle)

    2019独角兽企业重金招聘Python工程师标准>>> 1.查表空间占用率: SELECT a.tablespace_name,a.total || 'M' total_space, ...

最新文章

  1. 求解方程Ax=b的通用程序
  2. 2019年上半年收集到的人工智能LSTM干货文章
  3. 零基础自学python看什么书-学习Python可以看书籍学习吗?老男孩Python入门课程
  4. eclipse java jdk_设置Eclipse和Java JDK
  5. 51nod 1100:斜率最大
  6. 从Loagistic 到 SVM算法
  7. android 缩放视图,当容器视图缩放为centerInside时,在android imageview中找到位图的位置...
  8. Nginx学习总结(5)——Nginx基本配置备忘
  9. javax.net.ssl.SSLException: closing inbound before receiving peer‘s close_notif---SpringCloud工作笔记111
  10. [收藏]数据库备份及恢复
  11. Python, Ruby 与 Groovy,谁与争锋
  12. java自学网视频教程,系列教学
  13. 华泰证券 python 自动交易软件_为何选用股票自动交易助手
  14. 群相册上传照片显示服务器繁忙,QQ相册上传速度慢怎么办 QQ相册上传不了照片解决方法...
  15. 5类6类7类网线对比_超详细的超五类、六类、七类网线的对比
  16. 我理解的MOOC的重要性
  17. 基于Linux+ARM的远程视频监控--硬件篇
  18. java通过进程名称杀进程_根据进程名杀死进程 -kill进程名
  19. IDEA启动Nacos配置SOCKS代理
  20. 关于终身成长的几点感想

热门文章

  1. Spring和Junit整合
  2. php mysql上传多张图片_PHP开发之多个文件上传到MySql数据库(一)
  3. cookies丢失 同域名_后端设置Cookie前端跨域获取丢失问题(基于springboot实现)
  4. matlab 传输速率,处理速率转换 - MATLAB Simulink - MathWorks 中国
  5. LeetCode题集大全
  6. 【音视频安卓开发 (七)】安卓视频播放窗口去掉标题栏、全屏、横屏
  7. Ubuntu下如何正确安装FFmpeg
  8. excel运行没反应_Excel数据很少文件却很大,问题出在哪里呢?两种方法轻松解决...
  9. C语言指针变量与一维数组
  10. android网络转圈,android基于dialog加载时转圈圈很好的demo