Codeforces878C. Tournament
$n \leq 50000$个人,每个人有$K \leq 10$个属性,现对每一个前缀问:进行比赛,每次任意两人比任意属性,小的淘汰(保证同一属性不会出现两个相同的数),最终有几个人有可能获胜。
明显是一个竞赛图了,缩完点就是求拓扑序最高那个强连通分量的大小。现在要一个一个把人加入。
可以观察到,缩完点之后,两个分量之间一定有边,表示一个分量“完胜”另一个,就是不管比哪个属性这个分量里的人都能赢另外一个。所以把分量按某个属性的最小值排序的话,任意一个属性与此同时都是按最小值排序的,同时也是按任意属性最大值排序的。
加入一个人,他可能战胜一些分量(某个属性大于这个分量的最小值),可能被一些分量战胜(某个属性小于这个分量的最大值),因此可能合并一些分量。需要把分量值按从小到大一直维持有序,并插入删除点,用set即可。一个分量的信息可以存在数组中,找分量中的一个“代表”存,会使代码简洁。
- //#include<iostream>
- #include<cstring>
- #include<cstdio>
- //#include<math.h>
- #include<set>
- //#include<queue>
- //#include<vector>
- #include<algorithm>
- #include<stdlib.h>
- using namespace std;
- #define LL long long
- int qread()
- {
- char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
- do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
- }
- //Pay attention to '-' , LL and double of qread!!!!
- int n,K;
- #define maxn 50011
- int a[maxn][],b[maxn][],size[maxn];
- struct snode
- {
- int id,v;
- bool operator < (const snode &b) const {return v<b.v;}
- };
- set<snode> s;
- bool Win(int x,int y)
- {
- for (int i=;i<=K;i++) if (b[x][i]>a[y][i]) return ;
- return ;
- }
- int main()
- {
- n=qread(); K=qread();
- for (int i=;i<=n;i++)
- for (int j=;j<=K;j++)
- a[i][j]=b[i][j]=qread();
- for (int i=;i<=n;i++)
- {
- size[i]=;
- set<snode>::iterator it;
- while (!s.empty())
- {
- it=s.lower_bound((snode){,a[i][]});
- if (it==s.end()) break;
- int u=(*it).id;
- if (Win(i,u))
- {
- size[i]+=size[u];
- for (int j=;j<=K;j++)
- a[i][j]=min(a[i][j],a[u][j]),b[i][j]=max(b[i][j],b[u][j]);
- s.erase(it);
- }
- else break;
- }
- while (!s.empty())
- {
- it=s.lower_bound((snode){,a[i][]});
- if (it==s.begin()) break;
- it--; int u=(*it).id;
- if (Win(u,i))
- {
- size[i]+=size[u];
- for (int j=;j<=K;j++)
- a[i][j]=min(a[i][j],a[u][j]),b[i][j]=max(b[i][j],b[u][j]);
- s.erase(it);
- }
- else break;
- }
- s.insert((snode){i,a[i][]});
- printf("%d\n",size[(*--s.end()).id]);
- }
- return ;
- }
Codeforces878C. Tournament的更多相关文章
- 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 ...
- Rock-Paper-Scissors Tournament[HDU1148]
Rock-Paper-Scissors TournamentTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- CF 628A --- Tennis Tournament --- 水题
CF 628A 题目大意:给定n,b,p,其中n为进行比赛的人数,b为每场进行比赛的每一位运动员需要的水的数量, p为整个赛程提供给每位运动员的毛巾数量, 每次在剩余的n人数中,挑选2^k=m(m & ...
- 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 ...
- 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 ...
- Educational Codeforces Round 13 E. Another Sith Tournament 概率dp+状压
题目链接: 题目 E. Another Sith Tournament time limit per test2.5 seconds memory limit per test256 megabyte ...
- CodeForce 356A Knight Tournament(set应用)
Knight Tournament time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- 遗传算法selection总结-[Fitness, Tournament, Rank Selection]
假设个体(individual)用\(h_i\)表示,该个体的适应度(fitness)为\(Fitness(h_i)\),被选择的概率为\(P(h_i)\). 另外假设种群(population)的个 ...
- 【CF913F】Strongly Connected Tournament 概率神题
[CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...
随机推荐
- java基础—方法重载(overload)
一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样.只要这两方面有其中的一方面不一样就可以构成方法 ...
- 第四次作业:Windows各种基本应用的命令处理方法
删除文件夹命令? rd (remove directory) 如何给文件夹重新命名? ren (rename) 如何在文件夹中建立文件夹? md swift\a 如何用命令查看文本文件的内容? typ ...
- salt常用模块
salt 常用命令整理 转载:https://www.cnblogs.com/aslongas/p/6964890.html salt 常用命令整理 ***********模块******** ...
- Robot Framework user guide
http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html
- 服务器TIME_WAIT和CLOSE_WAIT分析和解决办法
先上两张图: 查看TIME_WAIT和CLOSE_WAIT数的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a ...
- 多线程辅助类之CountDownLatch(三)
CountDownLatch信号灯是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.它可以实现多线程的同步互斥功能,和wait和notify方法实现功能类似,具体 ...
- c++IDE
暂时使用Code::Blocks 16.01. 因为之前没有c++编译器,所以去官网选择安装codeblocks-16.01mingw-setup.exe 然后settings>Compiler ...
- 命令行执行Qt程序
原文网址 //helloworld.cpp #include <QApplication> #include <QPushButton> int main(int argc,c ...
- 最长回文子串——manacher
最长回文子串--Manacher 算法 (原版的博主的代码都是用py写的,这里改成c++) c++ 算法 字符串处理 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一 ...
- 蓝桥--2n皇后问题(递归)--搬运+整理+注释
N皇后问题: #include <iostream> #include <cmath> using namespace std; int N; ];//用来存放算好的皇后位置. ...