随笔分类 -  并查集

摘要:带权并查集食物链(模3系),三个物种,给一些关系,同类、被吃、吃。问哪些关系是错的。 同类关系是0,点吃根节点的关系是1,根节点吃点关系是2即可。 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> # 阅读全文
posted @ 2018-09-13 23:04 LMissher 阅读(88) 评论(0) 推荐(0)
摘要:带权并查集模2系,也就是给一些关系 ,这些关系是是否同类。问有多少关系错的。 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int M = 2 阅读全文
posted @ 2018-09-13 23:01 LMissher 阅读(92) 评论(0) 推荐(0)
摘要:逆序并查集 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y second #define lson l,mid,rt<<1 #define rson mid+1, 阅读全文
posted @ 2018-09-12 14:50 LMissher 阅读(97) 评论(0) 推荐(0)
摘要:有一个有300个座位的圆,现在给出n个两个人间的座位信息,问有几个信息是错误的。 当一个信息和前面的信息矛盾被认为是错误的。 一个模300系的带权并查集。势能高的向势能低的树合并,合并时压缩路径并将相对于根节点的势能更新。 #include <bits/stdc++.h> #define pb pu 阅读全文
posted @ 2018-09-12 14:22 LMissher 阅读(118) 评论(0) 推荐(0)
摘要:有n个数字,不知道具体是多少,给q个信息。 每个信息给一个区间[l,r]。并告诉这个区间的奇数有多少个,问第一个错误的信息是第几个。 可以把每个区间的左端点-1的根看做右端点的根的根,用并查集维护一个到根点的1的个数是奇数还是偶数即可。 注意得离散化。 #include <cstdio> #incl 阅读全文
posted @ 2018-09-11 18:45 LMissher 阅读(141) 评论(0) 推荐(0)
摘要:每个信息给一个子区间[l,r]的和,问有多少信息是错误的。 子区间[l,r]的和可以知道是由r的前缀和减去l-1的前缀和。 所以presum[r]-presum[l-1]=sum[l,r]。所有可以把每个数字当成一个节点,两个节点间的势差为sum。 用并查集维护联通块及所有点与根节点的势差,那么如果 阅读全文
posted @ 2018-09-11 14:43 LMissher 阅读(118) 评论(0) 推荐(0)
摘要:一个城市有一个龙珠,每次两个操作,第一个操作把一个城市的龙珠移到另一个城市。 第二个操作询问第i个龙珠在哪个城市以及那个城市的size以及这个龙珠的转移次数。 用并查集维护一个联通块的size以及一个转换次数cnt。 每次合并联通块的时候把根节点的cnt++,然后在find的时候做压缩路径以及字节点 阅读全文
posted @ 2018-09-11 13:48 LMissher 阅读(138) 评论(0) 推荐(0)
摘要:初始有n堆东西每堆一个物品,有两个操作,第一个把含有第x个物品的那堆物品放到含有第y个物品的那堆物品上。 第二个询问第x个物品下面有多少物品。 用并查集维护一个联通块的size以及每个节点到根节点的距离。 第一个操作的时候size[root[x]]+=size[root[y]]并且y的根节点的距离更 阅读全文
posted @ 2018-09-11 13:07 LMissher 阅读(131) 评论(0) 推荐(0)
摘要:water #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> using namespace std; const int M = 1007; int f[M],r 阅读全文
posted @ 2018-09-11 10:04 LMissher 阅读(126) 评论(0) 推荐(0)
摘要:题意:求连通块中有多少个环。 题解:如果两数的祖先相同则总数加1,否则合并。 代码: #include <cstdio>int pre[2100],sum[2100],tot;int find(int x){ int r = x; while(pre[r] != r){ r = pre[r]; } 阅读全文
posted @ 2017-08-21 14:57 LMissher 阅读(183) 评论(0) 推荐(0)
摘要:题意:求各个连通块中人数最大的那个并输出。 题解:在join函数里加一个num数组存各个联通块的人数,并找出最大的那个。(要压缩路径) 代码: #include <cstdio>using namespace std;int pre[210000],num[210000],max;int find( 阅读全文
posted @ 2017-08-21 14:42 LMissher 阅读(173) 评论(0) 推荐(0)
摘要:题意:小明开展一个聚会,邀请了n个朋友。认识的朋友才能在一桌(A认识B,B认识C,则C也认识A)。问需要几个桌子。 题解:用并查集求有几个联通块。 代码: #include <cstdio>int pre[1100];int find(int x){ int r = x; while(pre[r] 阅读全文
posted @ 2017-08-21 13:21 LMissher 阅读(147) 评论(0) 推荐(0)