![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并查集
文章平均质量分 52
1
kaka0010
退役ACMer/算法竞赛菜鸡
展开
-
P3224 [HNOI2012]永无乡 并查集+线段树合并
原题链接:https://www.luogu.com.cn/problem/P3224目录题意分析Code题意分析和主席树操作有些像,查询区间K大,但这题又带上了修改,因此我们考虑用线段树合并。直接开n个权值线段树,然后用并查集维护当前连通块。由于这题比较模板,就不多解释了。Code#include <bits/stdc++.h>#define lowbit(i) i & -i#define Debug(x) cout << x << endl原创 2021-07-28 18:25:08 · 98 阅读 · 0 评论 -
2021牛客暑期多校训练营3 B.Black and white 最小生成树
原题链接:https://ac.nowcoder.com/acm/contest/11254/B目录题意分析Code题意你需要将n*m的矩阵全部变成黑色(初始为白色),每个点都有一个花费,并且如果任意一个矩阵的三个顶点为黑,那么剩下那个顶点自动变黑,问最小的花费。分析根本就没往图这方面想,题目还是具有很大的欺骗性。如果自己手画一下的话,很容易发现其实最少只要涂n+m-1个点就可以了,再与行和列联系一下,不就是以行列为点的最小生成树吗?我们再仔细分析一下,如果(x1,y1)(x2,y2)(x1,y原创 2021-07-28 10:27:43 · 129 阅读 · 0 评论 -
Codeforces Round #714 (Div. 2) D. GCD and MST 并查集+优化kruskal
原题链接:https://codeforces.ml/contest/1513/problem/D目录题意分析Code题意有n个点,每个点都有自己的权值ai两点之间的连边满足以下要求:gcd(ai,ai+1...aj)=min(ai,ai+1...aj)gcd(a_{i},a_{i+1}...a_{j})=min(a_{i},a_{i+1}...a_{j})gcd(ai,ai+1...aj)=min(ai,ai+1...aj) i和j可以连一条权值为min(ai,ai+1...aj)原创 2021-04-12 13:13:23 · 149 阅读 · 0 评论 -
Educational Codeforces Round 105 D. Dogeforces 并查集+思维
原题链接:https://codeforces.ml/contest/1494/problem/D目录题意分析Code题意给一个n*n的矩阵,每个位置值代表i和j的最近祖先的权值,树上父节点权值严格大于子节点,最后请你构造出整棵树。分析因为父节点严格大于子节点权值,因此我们可以按照权值顺序来考虑,权值越小也就是越接近叶子,所以我们从叶子开始考虑。同时我们为了构造出树,必须要记住所有相连的边。我们从下往上开始连,一开始是一个森林,所以我们用并查集维护这个节点目前的根节点是什么,然后合并森林的时候就原创 2021-03-03 19:49:44 · 157 阅读 · 1 评论 -
Educational Codeforces Round 103 (Rated for Div. 2) D. Journey 并查集
https://codeforces.com/contest/1476/problem/D目录题意分析Code题意有n+1个城市,和n条路,路由L和R表示往左走或者往右走,但路的方向不是固定的,每走一次所有的路就会改变一次方向,问从每个城市出发最多能到达的城市数量。分析数据是3e5,如果反着建边跑dfs肯定会超时,所以我们要思考O(n)的解决方案。我们发现如果要整个联通块都可达,那么LR一定是相间出现的,因此我们从联通块入手,将原字符串分成不同的联通块并计算联通块内的个数,然后分析一下城市两边的不原创 2021-01-30 20:14:01 · 182 阅读 · 1 评论 -
CF 160D Edges in MST 最小生成树 + 割边
原题链接文章目录题意分析AC Code题意给定n个点和m条边,有三种情况这条边是最小生成树所必须的边这条边存在于不只一个最小生成树中这条边不包含在任何一个最小生成树中询问所有边的情况。分析如果一条边可以替换别的边成为最小生成树的边,那么它们的权值肯定是相同的,因此我们可以考虑所有权值相等的边。我们将这些边与当前连通块相连,如果存在一条边是桥,那么它一定是不可或缺的,所以答案记为any,否则为at least one。然后就是正常的最小生成树做法,如果这当前边的两个点都已经在连通块中了,原创 2020-12-20 20:09:10 · 283 阅读 · 0 评论 -
CF 891C Envy 最小生成树+可撤销并查集
原题链接文章目录题意分析AC Code题意给定n个定,m条边,接下来有k组询问,每次给定一个集合,问能否用这些集合的点构成MST。分析如果每次只问一条边,我们可以用树剖或树上倍增找到这条链上最大值再替换成询问的边,但现在询问为一个集合,因此问题复杂很多。关于kruskal有两个很有趣的定理定义wi为每一条边,对于任意wi,我们选择长度<wi的边构成的联通块是相同的定义最小生成树中边长为wi的边条数有ci条,对于所有的最小生成树来说,wi和ci都是相同的考虑离线的处理方法,我们把所原创 2020-12-18 14:09:10 · 318 阅读 · 1 评论 -
CF 1444C Team-Building 可撤销并查集+种类并查集判二分图
文章目录题意分析代码题意给定n个点,m条边,k个集合。每个点都属于自己的集合,每次取任意两个集合构成的子图,问是否是二分图,最后求二分子图的个数。分析根据题目的数据范围,暴力枚举子图加dfs判二分图是肯定会超时的,因此考虑另一种判二分图的方法,种类并查集。种类并查集判二分图的方法:假设x和y分别处于二分图的两部分,那么我们建立两个点的虚点x+n和y+n代表对立面的点,因此从x和y+n是处于一个集合中的,y和x+n同理。最后如果发现x和y在一个集合中,说明存在奇环即不是二分图。然后我们考虑两个集合原创 2020-12-17 20:52:43 · 164 阅读 · 0 评论 -
UVA 11987 Almost Union-Find 并查集(建立虚点)
题目链接文章目录题意分析完整代码题意给定1到n的数列分别处在1到n的集合中,有以下三种操作1 x y 表示把x所在的集合和y所在的集合合并(如果x和y已经在一个集合中,忽略此操作)2 x y 表示将x移动到y所在的集合中(如果x和y已经在一个集合中,忽略次操作)3 x 询问x所在的集合的元素个数和元素之和分析单从1和3的询问来看,就是一个并查集的模板题,但是如何去维护操作2呢。我们肯定不能直接将x合并到y中,因为x肯定有自己的子树,如果移动了x,那么x的子树上的点就没办法正确找到祖先。我原创 2020-12-17 17:00:34 · 141 阅读 · 0 评论 -
牛客小白月赛25 C白魔法师 (bfs | 并查集)
题目描述:题目链接题意分析:n个节点 n-1条边,非常明显的树形结构(题目中就有说 ),因此不需要考虑环的情况。树上有两种颜色,一种是白色一种是黑色,我们可以推断出这题应该是考虑连通块的大小,那么考虑两种思路,一种是bfs,一种是并查集。1.bfs我们可以用siz来记录这个连通块的大小,vis来记录这个点是否被访问到,sd记录每个点属于哪个连通块,因此利用bfs深搜的性质可得到所有连通块的大小。然后我们再逐个点处理,如果这个点是B,那么我们考虑如果将这个点染成白色之后的连通块大小,下面贴上代码原创 2020-05-21 16:35:24 · 313 阅读 · 1 评论