并查集
sunyutian1998
这个作者很懒,什么都没留下…
展开
-
Mahmoud and a Dictionary CodeForces - 766D
点击打开链接 将一点拆为两点 a与a' 如果说a与b为朋友 先判断 a和b‘(或a’与b)是不是在同一集合 是的话就错 不是的话就将 a与b a'与b' 合并 如果说a与b为敌人也是一个道理 #include <bits/stdc++.h> using namespace std; map <string,int> mp; int f[200010]; ...原创 2017-10-31 11:43:37 · 188 阅读 · 0 评论 -
A Bug's Life POJ - 2492
http://poj.org/problem?id=2492 种类并查集就是多维护了一个dis数组 表示当前元素与该点所在集合代表元素的关系 在压缩路径和合并时单独维护一下即可 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const in...原创 2019-02-26 21:38:35 · 252 阅读 · 0 评论 -
明辨是非 51Nod - 1515
https://www.51nod.com/Challenge/Problem.html#!#problemId=1515 注意这题跟种类并查集不沾边 因为a!=b&&b!=c推不出a==c 对于每个集合u 把所有与u不等的集合v1 v2...都存入一个vector 在合并u与v时 对其中vector元素较少的一个进行遍历 判断是否包含另一个集合 即启发式合并 #in...原创 2019-03-02 15:02:52 · 226 阅读 · 0 评论 -
True Liars POJ - 1417
http://poj.org/problem?id=1417 可以发现 a说b是神 则ab同类 反之则异类 这样可以处理出每个连通块内神或魔各有多少个 然后dp[i][j]代表走完前i个连通块后且有j个神的情况有多少 顺带记录一下路径即可 因为要求答案唯一 直接输出路径即可 #include <cstdio> #include <vector> #includ...原创 2019-02-27 20:37:52 · 159 阅读 · 0 评论 -
最优集合 51Nod - 1821
https://www.51nod.com/Challenge/Problem.html#!#problemId=1821 假设已选元素之和是sum 下一个待选的数是val 只有当val<=sum+1时 才满足选择当前元素之后[1,sum+val]内任意数都可以被已选元素表示 如果val>sum+1 则[sum+1,val-1]都无法用已选元素表示 鬼谷子钱袋问题为什么可以用二进制...原创 2018-11-19 14:38:21 · 254 阅读 · 0 评论 -
Draw a Mess ZOJ - 3544
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3544 正向考虑复杂度感人 那就逆向考虑 着过色的点之后就不再动了 每一行开个并查集优化一下就行 就是这几种图案分情况讨论要仔细点 #include <bits/stdc++.h> using namespace std; const int maxn...原创 2018-11-01 10:17:39 · 145 阅读 · 0 评论 -
Travel HDU - 5441
http://acm.hdu.edu.cn/showproblem.php?pid=5441 每次一个询问 给一个x 用所给边中值小于等于x的构图 问有多少点对是互相可达的 x显然要离线处理 多少点对的问题可以想到并查集搞一下 #include <bits/stdc++.h> using namespace std; const int maxn=2e4+10; const i...原创 2018-10-20 19:04:13 · 173 阅读 · 0 评论 -
Envy CodeForces - 892E
http://codeforces.com/problemset/problem/892/E 看着别人题解写的 算是学了一波可撤销并查集 结论 对于一条权值为w的边来说 如果在所有权值小于w的边全部加入图后这条边的两个端点还没有联通的话 那么这条边能出现在最小生成树中 对于单组询问来说 可以根据上述结论来判断 这里的多组询问可以离线处理 不太好处理的就是权值相同的边 首先按权值其次是查询的下...原创 2018-09-10 01:17:10 · 245 阅读 · 0 评论 -
Phone Call HDU - 6074
http://acm.hdu.edu.cn/showproblem.php?pid=6074 看完题解感觉很奇妙的一道题 和求最小生成树很相像! 先对m个操作按权值排序 可以想到每一次将abcd这四个点表示的两条链暴力合并在一起 最后看1所在连通块的总权值是多少 但是需要优化 可以开两个数组 f[i]就是普通并查集的代表元素 up[i]就是用来找i之上的一个与i不联通的点的 也是用并查集来维...原创 2018-08-25 20:05:07 · 146 阅读 · 0 评论 -
Almost Union-Find UVA - 11987
点击打开链接 2操作为关键 当一个元素从一个集合被并入另一个集合时,以该元素为根的所有节点会一同被并入另一集合 因此该操作通过建立 虚点 实现 所谓虚点,即其所在集合的数量与节点总和均不考虑该点 要将x节点并入y节点所在集合 首先将x从原集合删除 新建一个虚点并将x归入以该虚点为祖先的集合 然后再将以虚点为祖先的集合与以y所在集合进行合并 具体实现为 在f[n]数组中新开辟一个元...原创 2017-07-20 21:49:30 · 218 阅读 · 0 评论 -
Restructuring Company CodeForces - 566D
点击打开链接 2操作为关键 首先通过next[n]数组保存每个点之后(右)下一个要更新的点的下标 若该点的下标超出范围 则再无需操作 #include <bits/stdc++.h> using namespace std; int f[200010],next[200010]; int n; int getf(int p) { if(f[p]==p) retur...原创 2017-07-21 21:45:27 · 408 阅读 · 0 评论 -
Knight Tournament CodeForces - 357C
点击打开链接 模拟链表 next[i]表示第i个元素左边(右边亦可)第一个需要改变的元素 亦可用并查集 #include <stdio.h> int f[300010],next[300010]; int min(int u,int v); int main() { int n,m,i,j,x,y,z,t; while(scanf("%d%d",&a...原创 2017-07-23 19:53:16 · 256 阅读 · 0 评论 -
Arpa's weak amphitheater and Mehrdad's valuable Hoses CodeForces - 742D
点击打开链接 并查集确定各组妹子 每组只选一人或全选 假设某组有k人 则有(k+1)个选择 构成分组背包 重点在于理解分组背包 推荐博客点击打开链接 其实就是搞个假背包 对于某个分组 其中每个人都有真背包转移而来 暂存到假背包中 最后把真假背包合并一下即可 #include <bits/stdc++.h> using namespace std; #define ...原创 2017-09-15 14:08:19 · 276 阅读 · 0 评论 -
Find them, Catch them POJ - 1703
点击打开链接 维护两个并查集 f1与f2 题目中所给两点间的关系都是对立的 而一共只有两个阵营 因此可以得出 a敌对b且b敌对c 则a与c为同伙 对于两点间关系的询问 首先要看两点之间的敌友关系是否已经确定 如果以敌对关系为边建立子图 则图中相邻两点为敌 间隔一点为友 以此类推 因此只要两点连通即可确定关系 可通过并查集f1实现 其次要看是敌还是友 可通过标记数组实现 比如新增a敌对b 如...原创 2017-09-18 08:39:55 · 509 阅读 · 2 评论 -
食物链 POJ - 1182
点击打开链接 通俗易懂的博客 获益匪浅 点击打开链接 个人理解详见注释 初学种类并查集最好先做做模2循环的poj 2492 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=5e4+10; int f[ma...原创 2017-09-19 13:27:00 · 371 阅读 · 0 评论 -
Conquer a New Region HDU - 4424
点击打开链接 想了很久也没啥思路.. 看了博客才知道 原来并查集还能这么玩 根据题意 两点之间的运输能力取决于最小边 先把所有边降序排序 然后按照生成树的套路一条一条加 这样就满足了一定的单调性 同时并查集要增加两个维护对象 一个是本集合中所有点的数目 一个是本集合中所有点到boss节点的运输能力之和 这样 在加一条新边时 我们看一下究竟该让左端点所在集合的boss节点继续当boss 还...原创 2017-10-06 16:34:40 · 254 阅读 · 0 评论 -
Farm Irrigation HDU - 1198
点击打开链接 没什么道道 就是麻烦 要仔细 看每个块是什么类型 又能和什么类型的块相连 预处理一下即可 #include <bits/stdc++.h> using namespace std; struct node { int dir[4]; }; node per[11]; int mp[100][100]; int f[5000]; int n,m; ...原创 2017-11-05 17:49:18 · 225 阅读 · 0 评论 -
Chemical table CodeForces - 1013D
http://codeforces.com/problemset/problem/1013/D 如果整个矩形的四个边界中有相邻两个已填满 那剩下每个位置都可以被标示 比如这张图 有了左图的三个元素 右图上四个位置都可以三缺一的互相表示 对其他元素造成的影响等价于(r2,1) (r1,1) (1,c1) (1,c2)这四个边界位置 关键是怎么把已给的q个元素换到边界上去 就想到...原创 2018-08-03 09:03:17 · 465 阅读 · 0 评论 -
Gourmet choice CodeForces - 1131D
codeforces.com/problemset/problem/1131/D 先用并查集处理等号 通过大于小于号建图 拓扑判环 因为只把入度为0的点作为起点 所以拓扑可以顺带求出最长路 #include <cstdio> #include <cstring> #include <algorithm> #include <queue> ...原创 2019-03-09 12:25:34 · 186 阅读 · 0 评论