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 ...
随机推荐
- 如何配置php session使用redis集群
本实例基于phpredis 2.2.8,支持集群处理,php5.3及以上. 1.页面修改: ini_set('session.save_handler', 'rediscluster'); ini_s ...
- LOJ3120 CTS2019 珍珠 生成函数、二项式反演、NTT
传送门 题目大意:给出一个长度为\(n\)的序列\(a_i\),序列中每一个数可以取\(1\)到\(D\)中的所有数.问共有多少个序列满足:设\(p_i\)表示第\(i\)个数在序列中出现的次数,\( ...
- System.Data.Entity.Core.EntityException: 可能由于暂时性失败引发了异常。如果您在连接到 SQL Azure 数据库,请考虑使用 SqlAzureExecutionStrategy。
代码异常描述 ************** 异常文本 **************System.Data.Entity.Core.EntityException: 可能由于暂时性失败引发了异常.如果 ...
- 5_PHP数组_3_数组处理函数及其应用_7_数组排列函数
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 数组排列函数 1. sort() 函数 程序: <?php $array = array("img ...
- 2019年北航OO第三次博客总结
一.JML语言理论基础及其工具链 1. JML语言理论基础 JML是用于对Java程序进行规格化设计的一种表示语言,是一种行为接口规格语言(Behavior Interface Specificati ...
- React学习:状态(State) 和 属性(Props)
State 与 Props 区别props 是组件对外的接口,state 是组件对内的接口.组件内可以引用其他组件,组件之间的引用形成了一个树状结构(组件树),如果下层组件需要使用上层组件的数据或方法 ...
- HDFS写流程
HDFS client首先会与NameNode交互元数据信息,然后NameNode制定策略,分配NameNode节点,客户端先会与离自己最近的DataNode进行socket连接,已经与DataNod ...
- C#入门概述
ASP.NET 则是一种技术. Main方法 代码编写规范 命名规范
- Oracle IMP-00010 不是有效的导出文件,标头验证失败 解决方法
用IMP导入dmp文件时,出现IMP-00010 不是有效的导出文件,标头验证失败问题. 第一种:网上搜索到的大多解决方法是说导出文件时使用的Oracle版本不一致问题,需要修改dmp文件的版本号.如 ...
- MySQL之Prepared Statements
1.概述 prepared statement在MySQL4.1中引进并且增加了一些新的命令: COM_STMT_PREPARE COM_STMT_EXECUTE COM_STMT_CLOSE COM ...