![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
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 · 202 阅读 · 1 评论 -
CF884E Binary Matrix [并查集][滚动数组]
传送门题意: 求1的连通块的个数比较容易想到用并查集合并, 但是题目空间不允许因为只会和上面一排合并, 所以考虑滚动数组, 每次把根弄到最下面的一排#include<bits/stdc++.h>#define N 40050using namespace std;int fa[N], cnt, n, m; char s[N];int mp[2][N];int...原创 2019-07-10 17:02:59 · 392 阅读 · 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 · 175 阅读 · 0 评论 -
星球大战[并查集][倒序处理]
传送门此类删除不好做的题 , 倒过来按插入做 , 并查集维护一下就好 , 每次合并连通块数量 -1#include<bits/stdc++.h>#define N 400050using 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 · 188 阅读 · 0 评论 -
P1653 猴子 [并查集]
传送门考虑暴力 , 我们可以一次一次短边 , 然后判断连通性 , 显然是O(mn)的对于不容易判断删除后的连通性的 , 我们转换为倒序插入我们倒着插入 , 然后记录当前点与1连通的时刻发现一个点的答案就是它或它的祖先与1连通的时间的最小值 , find的时候更新一下即可#include<bits/stdc++.h>#define N 400050using n...原创 2018-12-16 20:17:55 · 243 阅读 · 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 · 200 阅读 · 0 评论 -
部落划分[二分答案+并查集]
传送门正解好像是Kruscal , 加入n-k跳边 , 第n-k+1条就是答案但知道题明显可以二分答案 , 把必须在一个集合的合并 , 如果集合个数<k 那么是不合法的#include<bits/stdc++.h>#define N 1050#define LL long longusing namespace std;int fa[N],n,k,x[N],...原创 2018-11-25 22:29:16 · 239 阅读 · 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 · 263 阅读 · 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 · 331 阅读 · 2 评论 -
并查集2
并查集之判断图的连通性最小生成树Kruskal,不在多赘述[HAOI2006]旅行题目描述Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。Z小镇附近共有N个景点(编号为1,2,3,…,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路。也许是为了保护该地的旅游资源,Z小镇有个奇怪的规定,就是对于一条给定的公路Ri,任何在该公路上行驶的车...原创 2018-08-27 13:06:23 · 152 阅读 · 0 评论 -
并查集6
并查集之不一定只有fa,还可能有多种情况(扩展域)什么意思就是传递关系不止一种时,可以像dp增加状态一样增加一些关系Parity game题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的样例输入1051 2 even3 4 odd5 6 even1 6 even7 10 odd样例输出3...原创 2018-08-27 15:06:06 · 155 阅读 · 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 · 224 阅读 · 0 评论 -
并查集3
并查集之判断图中的环与大小信息传递题目描述有 n 个同学(编号为 1到 n )正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学。游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息, 但是每人只会把信息告...原创 2018-08-27 13:08:18 · 178 阅读 · 2 评论 -
并查集1
并查集之将可以视为一个整体的东西合并(动态维护具有传递性的东西)[NOI2015]程序自动分析题目描述在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同...原创 2018-08-27 13:04:56 · 291 阅读 · 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 · 359 阅读 · 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 · 248 阅读 · 0 评论 -
双栈排序[并查集]
分析 网上很多人用二分图染色,但是并查集来判断冲突性也是极好的首先,单栈排序有这么一个性质网上有个证明(原网https://blog.csdn.net/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 · 196 阅读 · 0 评论