$n \leq 50000$个人,每个人有$K \leq 10$个属性,现对每一个前缀问:进行比赛,每次任意两人比任意属性,小的淘汰(保证同一属性不会出现两个相同的数),最终有几个人有可能获胜。

明显是一个竞赛图了,缩完点就是求拓扑序最高那个强连通分量的大小。现在要一个一个把人加入。

可以观察到,缩完点之后,两个分量之间一定有边,表示一个分量“完胜”另一个,就是不管比哪个属性这个分量里的人都能赢另外一个。所以把分量按某个属性的最小值排序的话,任意一个属性与此同时都是按最小值排序的,同时也是按任意属性最大值排序的。

加入一个人,他可能战胜一些分量(某个属性大于这个分量的最小值),可能被一些分量战胜(某个属性小于这个分量的最大值),因此可能合并一些分量。需要把分量值按从小到大一直维持有序,并插入删除点,用set即可。一个分量的信息可以存在数组中,找分量中的一个“代表”存,会使代码简洁。

  1. //#include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. //#include<math.h>
  5. #include<set>
  6. //#include<queue>
  7. //#include<vector>
  8. #include<algorithm>
  9. #include<stdlib.h>
  10. using namespace std;
  11.  
  12. #define LL long long
  13. int qread()
  14. {
  15. char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
  16. do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
  17. }
  18.  
  19. //Pay attention to '-' , LL and double of qread!!!!
  20.  
  21. int n,K;
  22. #define maxn 50011
  23. int a[maxn][],b[maxn][],size[maxn];
  24. struct snode
  25. {
  26. int id,v;
  27. bool operator < (const snode &b) const {return v<b.v;}
  28. };
  29. set<snode> s;
  30.  
  31. bool Win(int x,int y)
  32. {
  33. for (int i=;i<=K;i++) if (b[x][i]>a[y][i]) return ;
  34. return ;
  35. }
  36.  
  37. int main()
  38. {
  39. n=qread(); K=qread();
  40. for (int i=;i<=n;i++)
  41. for (int j=;j<=K;j++)
  42. a[i][j]=b[i][j]=qread();
  43. for (int i=;i<=n;i++)
  44. {
  45. size[i]=;
  46. set<snode>::iterator it;
  47. while (!s.empty())
  48. {
  49. it=s.lower_bound((snode){,a[i][]});
  50. if (it==s.end()) break;
  51. int u=(*it).id;
  52. if (Win(i,u))
  53. {
  54. size[i]+=size[u];
  55. for (int j=;j<=K;j++)
  56. a[i][j]=min(a[i][j],a[u][j]),b[i][j]=max(b[i][j],b[u][j]);
  57. s.erase(it);
  58. }
  59. else break;
  60. }
  61. while (!s.empty())
  62. {
  63. it=s.lower_bound((snode){,a[i][]});
  64. if (it==s.begin()) break;
  65. it--; int u=(*it).id;
  66. if (Win(u,i))
  67. {
  68. size[i]+=size[u];
  69. for (int j=;j<=K;j++)
  70. a[i][j]=min(a[i][j],a[u][j]),b[i][j]=max(b[i][j],b[u][j]);
  71. s.erase(it);
  72. }
  73. else break;
  74. }
  75. s.insert((snode){i,a[i][]});
  76. printf("%d\n",size[(*--s.end()).id]);
  77. }
  78. return ;
  79. }

Codeforces878C. Tournament的更多相关文章

  1. Codeforces CF#628 Education 8 A. Tennis Tournament

    A. Tennis Tournament time limit per test 1 second memory limit per test 256 megabytes input standard ...

  2. Rock-Paper-Scissors Tournament[HDU1148]

    Rock-Paper-Scissors TournamentTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...

  3. CF 628A --- Tennis Tournament --- 水题

    CF 628A 题目大意:给定n,b,p,其中n为进行比赛的人数,b为每场进行比赛的每一位运动员需要的水的数量, p为整个赛程提供给每位运动员的毛巾数量, 每次在剩余的n人数中,挑选2^k=m(m & ...

  4. ural 1218. Episode N-th: The Jedi Tournament

    1218. Episode N-th: The Jedi Tournament Time limit: 1.0 secondMemory limit: 64 MB Decided several Je ...

  5. URAL 1218 Episode N-th: The Jedi Tournament(强连通分量)(缩点)

    Episode N-th: The Jedi Tournament Time limit: 1.0 secondMemory limit: 64 MB Decided several Jedi Kni ...

  6. Educational Codeforces Round 13 E. Another Sith Tournament 概率dp+状压

    题目链接: 题目 E. Another Sith Tournament time limit per test2.5 seconds memory limit per test256 megabyte ...

  7. CodeForce 356A Knight Tournament(set应用)

     Knight Tournament time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  8. 遗传算法selection总结-[Fitness, Tournament, Rank Selection]

    假设个体(individual)用\(h_i\)表示,该个体的适应度(fitness)为\(Fitness(h_i)\),被选择的概率为\(P(h_i)\). 另外假设种群(population)的个 ...

  9. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

随机推荐

  1. java基础—方法重载(overload)

    一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样.只要这两方面有其中的一方面不一样就可以构成方法 ...

  2. 第四次作业:Windows各种基本应用的命令处理方法

    删除文件夹命令? rd (remove directory) 如何给文件夹重新命名? ren (rename) 如何在文件夹中建立文件夹? md swift\a 如何用命令查看文本文件的内容? typ ...

  3. salt常用模块

    salt 常用命令整理     转载:https://www.cnblogs.com/aslongas/p/6964890.html salt 常用命令整理 ***********模块******** ...

  4. Robot Framework user guide

    http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html

  5. 服务器TIME_WAIT和CLOSE_WAIT分析和解决办法

    先上两张图: 查看TIME_WAIT和CLOSE_WAIT数的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a ...

  6. 多线程辅助类之CountDownLatch(三)

    CountDownLatch信号灯是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.它可以实现多线程的同步互斥功能,和wait和notify方法实现功能类似,具体 ...

  7. c++IDE

    暂时使用Code::Blocks 16.01. 因为之前没有c++编译器,所以去官网选择安装codeblocks-16.01mingw-setup.exe 然后settings>Compiler ...

  8. 命令行执行Qt程序

    原文网址 //helloworld.cpp #include <QApplication> #include <QPushButton> int main(int argc,c ...

  9. 最长回文子串——manacher

    最长回文子串--Manacher 算法 (原版的博主的代码都是用py写的,这里改成c++) c++ 算法 字符串处理 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一 ...

  10. 蓝桥--2n皇后问题(递归)--搬运+整理+注释

    N皇后问题: #include <iostream> #include <cmath> using namespace std; int N; ];//用来存放算好的皇后位置. ...