100: cf 878C set+并查集+链表
$des$
Berland要举行 $n$ 次锦标赛,第一次只有一个人,之后每一次会新
加入一个人。锦标赛中有 $k$ 种运动项目,每个人在这 $k$ 种项目上都有一
个能力值,每次会选择任意两个还未被淘汰的人进行某个项目的比
赛,能力值高的人胜出,输的人被淘汰,直至只剩下一个人成为冠
军。
给出每个人每个项目的能力值,保证它们两两不同,求每次锦标
赛有多少人可能成为冠军。
$sol$
只要选手 $a$ 在某个项目上比选手 $b$ 强, $a$ 就可以淘汰 $b$,我们可以连
一条 $a$ 到 $b$ 的边。
对整个图求强连通分量,缩点后一定会形成一个竞赛图,拓扑序
最靠前的分量中的所有点都可能成为冠军。
每加入一个点时,我们可能需要合并拓扑序在一段区间内强连通
分量。用set按拓扑序维护每个强连通分量,对每个分量记录它的大
小,以及在每个项目上的最大和最小能力值,就可以直接在set上二分
找到需要合并的区间。
最多只会合并 $n - 1$ 次,时间复杂度 $O(nklogn)$
$code$
#include <bits/stdc++.h> using namespace std; #define gc getchar()
inline int read() {
int x = ; char c = gc;
while(c < '' || c > '') c = gc;
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x;
} #define Rep(i, a, b) for(int i = a; i <= b; i ++)
#define MP(a, b) make_pair(a, b) const int N = 5e4 + ; int A[N][];
int Max[N][];
int n, m;
int fa[N], size[N], nxt[N], last = ;
int Answer[N]; set<pair<int, int> > S[]; int Get(int x) {
return fa[x] == x ? x : fa[x] = Get(fa[x]);
} void Merge(int a, int b) {
Rep(i, , m) Max[b][i] = max(Max[b][i], Max[a][i]);
size[b] += size[a], fa[a] = b;
} int main() {
n = read(), m = read(); Rep(i, , n) Rep(j, , m) Max[i][j] = A[i][j] = read();
Rep(i, , n) fa[i] = i, size[i] = ;
Rep(i, , m) S[i].insert(MP(A[][i], )); Answer[] = ; Rep(i, , n) {
int a = , b = ;
set<pair<int, int> > :: iterator it;
Rep(j, , m) {
it = S[j].upper_bound(MP(A[i][j], i));
if(it != S[j].end()) {
int t = Get((*it).second);
if(!b || Max[t][j] < Max[b][j]) b = t;
}
if(it != S[j].begin()) {
it --;
int t = Get((*it).second);
if(!a || Max[t][j] > Max[a][j]) a = t;
}
S[j].insert(MP(A[i][j], i));
}
if(!a) nxt[i] = b;
else if(!b) last = i, nxt[a] = i;
else if(a == b) Merge(i, a);
else if(Max[a][] < Max[b][]) nxt[a] = i, nxt[i] = b;
else {
for(int t = b; t != a; t = nxt[t], Merge(t, b));
Merge(i, b);
nxt[b] = nxt[a];
if(a == last) last = b;
}
Answer[i] = size[last];
} Rep(i, , n) cout << Answer[i] << "\n"; return ;
}
100: cf 878C set+并查集+链表的更多相关文章
- Codeforces #541 (Div2) - F. Asya And Kittens(并查集+链表)
Problem Codeforces #541 (Div2) - F. Asya And Kittens Time Limit: 2000 mSec Problem Description Inp ...
- 【CF878C】Tournament set+并查集+链表
[CF878C]Tournament 题意:有k个项目,n个运动员,第i个运动员的第j个项目的能力值为aij.一场比赛可以通过如下方式进行: 每次选出2个人和一个项目,该项目能力值高者获胜,败者被淘汰 ...
- CodeForces 566D Restructuring Company (并查集+链表)
题意:给定 3 种操作, 第一种 1 u v 把 u 和 v 合并 第二种 2 l r 把 l - r 这一段区间合并 第三种 3 u v 判断 u 和 v 是不是在同一集合中. 析:很容易知道是用并 ...
- Jzoj 初中2249 蒸发学水(并查集)
题目描述 众所周知,TerryHu 是一位大佬,他平时最喜欢做的事就是蒸发学水. 机房的位置一共有n 行m 列,一开始每个位置都有一滴学水,TerryHu 决定在每一个时刻选择 一滴学水进行蒸发,直到 ...
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem C (Codeforces 828C) - 链表 - 并查集
Ivan had string s consisting of small English letters. However, his friend Julia decided to make fun ...
- CF思维联系--CodeForces - 218C E - Ice Skating (并查集)
题目地址:24道CF的DIv2 CD题有兴趣可以做一下. ACM思维题训练集合 Bajtek is learning to skate on ice. He's a beginner, so his ...
- 稀疏图(邻接链表),并查集,最短路径(Dijkstra,spfa),最小生成树(kruskal,prim)
全部函数通过杭电 1142,1162,1198,1213等题目测试. #include<iostream> #include<vector> #include<queue ...
- cf-Round541-Div2-F(并查集+静态链表)
题目链接:http://codeforces.com/contest/1131/problem/F 思路: 很容易看出这是一道并查集的题目,因为要输出每个cage中住的鸟的编号,故采用静态链表.用l[ ...
- Codeforces 1131 F. Asya And Kittens-双向链表(模拟或者STL list)+并查集(或者STL list的splice()函数)-对不起,我太菜了。。。 (Codeforces Round #541 (Div. 2))
F. Asya And Kittens time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- python 多进程和协程配合使用
一.需求分析 有一批key已经写入到3个txt文件中,每一个txt文件有30万行记录.现在需要读取这些txt文件,判断key是否在数据仓库中.(redis或者mysql) 为空的记录,需要写入到日志文 ...
- 服务端技术选型与考虑(go)
- JPA、Hibernate、Spring data jpa之间的关系,以及和springboot的整合
什么么是JPA? 全称Java Persistence API,可以通过注解或者XML描述[对象-关系表]之间的映射关系,并将实体对象持久化到数据库中. 为我们提供了: 1)ORM映射元数据:JPA支 ...
- java之hibernate之配置讲解
1.映射文件:User.hbm.xml <!-- package 指向class中所有类的包名,可以直接在指定类名时同时指定包名 --> <hibernate-mapping pac ...
- 15天入门RT-Thread之第一天
今天开始学习jiezhi15天的RT-Thread入门系列课程 感谢RT-Thread提供的免费课程,终于可以系统入门RT-Thread ,感兴趣的同学可以关注RT-Thread官方公众号,获取最新的 ...
- SharePoint中用Power shell命令设置文档库列表的权限
首先停止继承权限 $web = Get-PnPweb $spoList= Get-PnPList "Testlist" -Web $web (注释:获取对象)$spoList.Br ...
- python 笔记二
17.进程线程 进程间通信方式:管道Pipe:队列Queue:共享内存Value.Array.Manager: 多进程同步:锁Lock.递归锁RLock.Condition(条件变量):事件event ...
- 【JUC】4.Synchronized与ReentrantLock对比
与synchronized相同,ReentrantLock也是一种互斥锁: synchronized与ReentrantLock的对比: 都是可重入锁 可以再次获取自己的内部锁,即:一个线程获取某对象 ...
- zabbix-proxy及ELK
1.添加tomcat监控模版 yum install java-1.8.0-openjdk tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp ...
- SpringCloud_Eureka与Zookeeper对比
关系型数据库与非关系型数据库及其特性: RDBMS(Relational Database Management System 关系型数据库) :mysql/oracle/sqlServer等 = ...