
并查集
FSYo
我不去想是否能够成功,
既然选择了远方,
便只顾风雨兼程
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
CometOJ contest#13「佛御石之钵 -不碎的意志-」(并查集+Set)
题意:n∗m,n,m≤1e3n*m,n,m\le 1e3n∗m,n,m≤1e3 的矩阵,矩阵赋 1,查询 1 的连通块个数,q≤3e4q\le3e4q≤3e4 次修改 想到用并查集维护连通块,每次暴力将矩阵中的合并肯定要凉 于是把矩阵中为 0 的踢出来合并 考虑到 nqnqnq 可能可以卡过,于是用 setsetset 维护每一行的为 000 的点,每次踢出来暴力改成 1 并与周围的合并 显然每个...原创 2019-10-25 23:47:42 · 262 阅读 · 1 评论 -
CF884E Binary Matrix [并查集][滚动数组]
传送门 题意: 求1的连通块的个数 比较容易想到用并查集合并, 但是题目空间不允许 因为只会和上面一排合并, 所以考虑滚动数组, 每次把根弄到最下面的一排 #include<bits/stdc++.h> #define N 40050 using namespace std; int fa[N], cnt, n, m; char s[N]; int mp[2][N]; int...原创 2019-07-10 17:02:59 · 453 阅读 · 0 评论 -
P4145 花神游历各国 [并查集+树状数组 / 线段树]
传送门 法1: 发现根号开几次就没了, 于是可以并查集动态维护区间的一段1, 遇到区间一段就直接跳到下一个不为1的地方 如果不是1就树状数组暴力单修 法2: 线段树维护区间最大, 如果最大<=1 就直接跳过, 否则递归修改儿子 树状数组+并查集 #include<bits/stdc++.h> #define N 100050 #define LL long long ...原创 2019-01-30 11:01:58 · 224 阅读 · 0 评论 -
星球大战[并查集][倒序处理]
传送门 此类删除不好做的题 , 倒过来按插入做 , 并查集维护一下就好 , 每次合并连通块数量 -1 #include<bits/stdc++.h> #define N 400050 using namespace std; int fa[N],n,m,p[N],vis[N],cnt,ans[N]; int first[N],next[N],to[N],tot; int read...原创 2018-12-30 14:36:34 · 252 阅读 · 0 评论 -
P1653 猴子 [并查集]
传送门 考虑暴力 , 我们可以一次一次短边 , 然后判断连通性 , 显然是O(mn)的 对于不容易判断删除后的连通性的 , 我们转换为倒序插入 我们倒着插入 , 然后记录当前点与1连通的时刻 发现一个点的答案就是它或它的祖先与1连通的时间的最小值 , find的时候更新一下即可 #include<bits/stdc++.h> #define N 400050 using n...原创 2018-12-16 20:17:55 · 286 阅读 · 0 评论 -
齿轮[带权并查集好题]
传送门 我们发现如果a与b的转比为k1 , b与c的转比为k2 , 那么a与c的转比为 k1*k2 我们并查集判连通性时 , 顺便维护一个dis , dis[x]表示dis与rt的转比 维护dis时 , 每次都乘上fa的dis就可以了 , 注意dis初始值为1 当出现环时 , 如果u与v的转比等于x/y就是合法的 , 发现u与v的转比就是dis[u]/dis[v] 判断一下就好 #i...原创 2018-12-01 10:15:11 · 257 阅读 · 0 评论 -
部落划分[二分答案+并查集]
传送门 正解好像是Kruscal , 加入n-k跳边 , 第n-k+1条就是答案 但知道题明显可以二分答案 , 把必须在一个集合的合并 , 如果集合个数<k 那么是不合法的 #include<bits/stdc++.h> #define N 1050 #define LL long long using namespace std; int fa[N],n,k,x[N],...原创 2018-11-25 22:29:16 · 284 阅读 · 0 评论 -
True Liars[扩展域并查集]
传送门 每个点拆成两个,表示好人或坏人 我们合并集合后,发现存在几组对立的集合 也就是说这个集合和与它对立的集合只能选一个 我们用rt1[i] , rt2[i] 表示第i个集合 和 与第i个集合对立的集合 cnt1,cnt2表示该集合好人的个数 用f[i][j]表示到第i个集合,好人为j的方案数 同时记录from[i][j] 表示f[i][j]选的是第i组集合的哪一个集合 ...原创 2018-11-18 10:51:38 · 308 阅读 · 0 评论 -
Rochambeau[扩展域并查集]
传送门 将一个点拆成3个,分别表示x_scissors , x_rock , x_cloth 如果x>y 那么表示x是scissors y就是cloth , x是rock y就是scissors , x是cloth y就是cloth 合并3个就可以了 我们是通过排除法来确定裁判编号的,枚举每个编号为裁判,一但在某一行输入中出现矛盾,我们就确定它不是裁判,那么n-1个出现矛盾的枚举中出...原创 2018-11-17 23:10:58 · 396 阅读 · 2 评论 -
并查集2
并查集之 判断图的连通性 最小生成树Kruskal,不在多赘述 [HAOI2006]旅行 题目描述 Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。Z小镇附近共有N个景点(编号为1,2,3,…,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路。也许是为了保护该地的旅游资源,Z小镇有个奇怪的规定,就是对于一条给定的公路Ri,任何在该公路上行驶的车...原创 2018-08-27 13:06:23 · 210 阅读 · 0 评论 -
并查集6
并查集之 不一定只有fa,还可能有多种情况(扩展域) 什么意思 就是传递关系不止一种时,可以像dp增加状态一样增加一些关系 Parity game 题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的 样例输入 10 5 1 2 even 3 4 odd 5 6 even 1 6 even 7 10 odd 样例输出 3...原创 2018-08-27 15:06:06 · 208 阅读 · 0 评论 -
并查集4
并查集之 找左右第一个大于(小于)x的数 模板:求左右第一个小于它的数 for(int i=1;i<=n;i++){ a[i].x=read(),a[i].id=i; fa[i]=ml[i]=i; } sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++){ int cur=a[i].id; vis[cur]=1; if(cur>...原创 2018-08-27 13:10:23 · 279 阅读 · 0 评论 -
并查集3
并查集之 判断图中的环与大小 信息传递 题目描述 有 n 个同学(编号为 1到 n )正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学。 游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息, 但是每人只会把信息告...原创 2018-08-27 13:08:18 · 237 阅读 · 2 评论 -
并查集1
并查集之 将可以视为一个整体的东西合并(动态维护具有传递性的东西) [NOI2015]程序自动分析 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同...原创 2018-08-27 13:04:56 · 411 阅读 · 0 评论 -
并查集刷题大全
并查集的两种写法 路径压缩 均摊复杂度O(logn) 代码 查询 int find(int x) return x==fa[x]?x:fa[x]=find(fa[x]); 修改 x=find(x),y=find(y); if(x!=y) fa[x]=y; 按秩合并 均摊复杂度O(log(n)) 每个节点一个秩,秩小的向秩大的合并,可以把秩看成树的深度 查询...原创 2018-08-27 13:02:06 · 437 阅读 · 0 评论 -
奶酪[并查集][NOIP2017]
又是一道并查集... 分析 如果两个洞的dist小于2倍r,两个洞连通,合并为1个集合,一个集合里面的洞都可以两两到达 判断超过h的洞与在最底下的洞在不在连不连通即判断在不在一个集合 并查集判断集合----看祖先是否相同即可 代码 #include<bits/stdc++.h> #define N 1005 #define LL long long usi...原创 2018-09-04 22:22:09 · 299 阅读 · 0 评论 -
双栈排序[并查集]
分析 网上很多人用二分图染色,但是并查集来判断冲突性也是极好的 首先,单栈排序有这么一个性质 网上有个证明(原网https://blog.youkuaiyun.com/linwh8/article/details/52606751) 能判定之后 我们令x_1表示x放在1里面 如果存在x<y<k 使q[k]<q[x]<q[i] 也就是x,y必须放在两...原创 2018-09-23 09:52:02 · 260 阅读 · 0 评论