$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 = 0; char c = gc;while(c < '0' || c > '9') c = gc;while(c >= '0' && c <= '9') x = x * 10 + c - '0', 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 + 10;int A[N][15];
int Max[N][15];
int n, m;
int fa[N], size[N], nxt[N], last = 1;
int Answer[N];set<pair<int, int> > S[15];int Get(int x) {return fa[x] == x ? x : fa[x] = Get(fa[x]);
}void Merge(int a, int b) {Rep(i, 1, 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, 1, n) Rep(j, 1, m) Max[i][j] = A[i][j] = read();Rep(i, 1, n) fa[i] = i, size[i] = 1;Rep(i, 1, m) S[i].insert(MP(A[1][i], 1));Answer[1] = 1;Rep(i, 2, n) {int a = 0, b = 0;set<pair<int, int> > :: iterator it;Rep(j, 1, 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][1] < Max[b][1]) 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, 1, n) cout << Answer[i] << "\n";return 0;
}

转载于:https://www.cnblogs.com/shandongs1/p/9791600.html

100: cf 878C set+并查集+链表相关推荐

  1. 牛客多校3 - Operating on a Graph(并查集+链表合并)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的无向图,每个点初始时都有颜色 i ,i ∈ [ 0 , n - 1 ] ,接下来有 q 次操作,每次操作会给出一种颜色 x ,分两种 ...

  2. 数据结构 之 并查集

    并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题. 有一个联合-查找算法(union-find algorithm)定义了两个操作用于此数据结构 ...

  3. 给我三分钟,带你领略热血江湖中的并查集算法

    你好,我是小黄,一名独角兽企业的Java开发工程师. 校招收获数十个offer,年薪均20W~40W. 感谢茫茫人海中我们能够相遇, 俗话说:当你的才华和能力,不足以支撑你的梦想的时候,请静下心来学习 ...

  4. CF思维联系--CodeForces - 218C E - Ice Skating (并查集)

    题目地址:24道CF的DIv2 CD题有兴趣可以做一下. ACM思维题训练集合 Bajtek is learning to skate on ice. He's a beginner, so his ...

  5. 【CF#505B】Mr. Kitayuta's Colorful Graph (并查集或Floyd或BFS)

    题干: Mr. Kitayuta has just bought an undirected graph consisting of n vertices and m edges. The verti ...

  6. 单链表式并查集应用(解决区间合并,区间删除,染色问题)

    单链表式并查集应用 普通并查集(树状): p[i]p[i]p[i] 表示节点 iii 的父节点, iii 所在树的根节点是代表元素. 单链表式并查集(单链表状)时间复杂度 O(m元素值域+n)O(m_ ...

  7. CF 1253D-Harmonious Graph-并查集+贪心

    Description You're given an undirected graph with n nodes and m edges. Nodes are numbered from 1 to ...

  8. CF 371D Vessels 【并查集】

    给出一个竖着的n个容器每个容器的容积,从上到下分别是1,2,3,4,,n,从某点开始浇水,保证该层满了后水能流向下一层,一层一层,直到不再溢出或者最底下都装满了留到地上去了为之. 给出n个操作/询问 ...

  9. kruskai算法c语言实现,并查集 - xiaobaoqiu Blog

    简介 并查集是一种非常简单的数据结构,它主要涉及两个基本操作,分别为: 1. 合并两个不相交集合; 2. 判断两个元素是否属于同一个集合; 实现 实现上,通常用一个数组实现,如100个元素可以用大小为 ...

  10. CH - 4901 关押罪犯(二分图判定+二分/并查集)

    题目链接:点击查看 题目大意:一共有n个罪犯,有m对仇人,每对仇人都有一个仇恨值,如果两个仇人在一起的话,会对监狱造成等价于仇恨值的损失,现在有两个监狱,可以将罪犯们分开关押,问监狱的最小损失是多少 ...

最新文章

  1. 高阶函数||编程范式: 命令式编程/声明式编程 || 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)
  2. 【机器视觉】 set_fuzzy_measure算子
  3. web开发者工具,118页Vue面试题总结,涨姿势!
  4. 知识图谱入门 ,语义搜索
  5. Codeforces 600E. Lomsat gelral(Dsu on tree学习)
  6. 四种进程或线程同步互斥的控制方法
  7. 掌握好数据分析,99%的企业都不会拒绝你
  8. 外贸最全出口流程,外贸必看基础知识
  9. 【Android工具】神器来了,游戏安装加速器ourplay,重点:附赠强大免费gmail邮箱注册...
  10. 我室友拿到了美团50万年薪,太牛逼了
  11. 工具类产品适合在微信公众号上运营吗?
  12. AI芯片产业生态及竞争格局:英伟达、谷歌、BAT实力拆解对比
  13. 【群友问题讨论】java类对象数组一些知识盲区
  14. Remote Desktop Connection Manager
  15. andorid身份证输入格式--EditText设置
  16. linux 卸载oracle
  17. Ntrip通讯协议1.0
  18. 2058:【例3.10】简单计算器
  19. 最大公约数-最小公倍数
  20. 手机测试用例-短消息测试用例

热门文章

  1. python解析多层json数据_python解析多层json操作示例
  2. javascript之js实现简单的无缝轮播图(可调节方向)
  3. 一、JDK下载安装、eclipse下载安装(带资源)
  4. Linux Ubuntu/Centos7 定时备份mysql数据库
  5. 分布式 id 生成系统 滴滴 Tinyid 快速入门
  6. 在spring管理的类的要注意问题
  7. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_13-webpack研究-webpack入门程序...
  8. ES6深入浅出_汇总贴
  9. 阶段3 1.Mybatis_03.自定义Mybatis框架_7.自定义Mybatis的编码-实现基于注解配置的查询所有...
  10. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_9_Stream流中的常用方法_concat...