![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并查集
ModestCoder_
一个modest的coder
展开
-
【学习笔记】课题研究:并查集的维护
这个是我以前的一个总结 并查集是用来维护连通性的,维护连通性的同时,我们还可以维护连通块里面其他的信息 最普遍的用法是 kruskal求最小生成树。 这个是按照边长度排序,然后维护连通性 然后是这道题 求∑所有路径中边长max−min\sum 所有路径中边长max-min∑所有路径中边长max−min 就先按照边长排序,然后边长满足递增或递减性,另外维护连通块元素的个数用来求方案数 再来一道题 题目转化成了序列,我就化归成上一道题目的链的形式 水箱 我们需要在连通块内维护高度,dp值 这道题目把维护连通块信原创 2020-12-04 12:08:35 · 265 阅读 · 0 评论 -
【题解】LuoGu6503:DIFERENCIJA
原题传送门 只要知道每个点作为最大/小值往左/右能扩展到哪里 这个可以用单调栈处理 O(n)O(n)O(n)解决 但是我有另一种方法 假如是一棵树,要求从某一点到另一点边权最大-边权最小加起来 可以用类似kruskalkruskalkruskal的并查集写法 详情见这道题目 然后我把这道题化归成一条链的情况 Code: #include <bits/stdc++.h> #define maxn 1000010 #define LL long long using namespace std; /原创 2020-10-25 18:15:27 · 168 阅读 · 0 评论 -
【题解】CF1213G:Path Queries
原题传送门 这个题目就比较套路了 此前做过三个比较相似的题目 就是并查集的同时维护一些信息,这题只要维护结点个数 按照边从小到大连 对于目前一条(x,y,l)(x,y,l)(x,y,l),找到xxx的祖先s1s1s1,yyy的祖先s2s2s2,ansl+=sizes1∗sizes2ans_{l}+=size_{s1}*size_{s2}ansl+=sizes1∗sizes2 Code: #include <bits/stdc++.h> #define maxn 200010 #define原创 2020-10-20 16:47:37 · 207 阅读 · 0 评论 -
【题解】LuoGu5423:[USACO19OPEN]Valleys P
原题传送门 根据两个式子展开的题目 首先按照高度从小到大排序好之后按顺序加点 对于新加的这个点,在四周四个点,如果已经加入了,就合并,用并查集维护 然后判断新加的点所属的连通块知否合法 F=E+2−V,即块数=边数+2−点数F=E+2-V,即块数=边数+2-点数F=E+2−V,即块数=边数+2−点数 F=1(边界框起来的一个大块)+元环个数+洞个数F=1(边界框起来的一个大块)+元环个数+洞个数F=1(边界框起来的一个大块)+元环个数+洞个数 定义元环为一个单位小正方形,就是四个点都已经加入的 然后合法就意原创 2020-09-22 16:44:19 · 318 阅读 · 0 评论 -
【题解】CF915F:Imbalance Value of a Tree
原题传送门 ∑i=1n∑j=1nI(i,j)\sum_{i=1}^{n}\sum_{j=1}^{n}I(i,j)∑i=1n∑j=1nI(i,j) =∑i=1n∑j=1nMax(i,j)−∑i=1n∑j=1nMin(i,j)=\sum_{i=1}^{n}\sum_{j=1}^{n}Max(i,j)-\sum_{i=1}^{n}\sum_{j=1}^{n}Min(i,j)=∑i=1n∑j=1nMax(i,j)−∑i=1n∑j=1nMin(i,j) 分别算出两部分的值,考虑并查集合并 对于一条边,这条原创 2020-09-10 21:18:23 · 257 阅读 · 0 评论 -
【题解】CF455C:Civilization
原题传送门 对于两个连通块连起来,肯定是在两个直径中点之间连一条边使得新的直径最短 并查集维护连通性,同时记录连通块的直径大小 令两个连通块的直径分别为lens1>lens2len_{s1}>len_{s2}lens1>lens2 则新的直径是max(lens1,lens1+12+lens2+12+1)max(len_{s1},\frac{len_{s1}+1}{2}+\frac{len_{s2}+1}{2}+1)max(lens1,2lens1+1+2lens2+1+1)原创 2020-09-09 21:20:41 · 208 阅读 · 0 评论 -
【题解】LuoGu5952:[POI2018]水箱
原题传送门 首先发现就是求一下把墙的高度看成边权,那么就求一个最小生成树,一边求,一边更新答案 对于两个连通块,维护f祖先,h最大高度,num总方案数f祖先,h最大高度,num总方案数f祖先,h最大高度,num总方案数 现在用kruskalkruskalkruskal连上一条长度为lll的边 新的连通块的方案数是(numx+l−hx)(numy+l−hy)(num_x+l-h_x)(num_y+l-h_y)(numx+l−hx)(numy+l−hy) Code: #include <bits/原创 2020-09-07 21:10:00 · 208 阅读 · 0 评论 -
【题解】CF1209D:Cow and Snacks
原题传送门 对于同一只动物喜欢的两种点心,用并查集连边 建好图后,对于一个点数>1的连通块,假设大小为xxx,用最优策略必定能满足x−1x-1x−1只动物,因为第一个来的必须取走两个,剩下的可以使得他们都只取走一个 再转换一下思路,对于一个动物,如果他喜欢的两种点心尚未在同一个连通块里,那么他在最优策略下是一定能被满足的,那就答案+1,并且并查集合并 然后我们求的是不能被满足的有多少 Code: #include <bits/stdc++.h> #define maxn 200010 us原创 2020-08-23 18:37:18 · 238 阅读 · 0 评论 -
【题解】LuoGu3623:[APIO2008]免费道路
原题传送门 转化题意:求一个有kkk条边是0边(鹅卵石路)的生成树 感觉比较套路 先把所有1边加入,并查集维护连通性,再加入必须加的0边,统计出多少条,哪几条0边是必须要的 如果必须要的0边>k>k>k,那么无解 接下来就重来一次,先把必须加的0边加入,然后尽可能加到kkk条0边,然后再尽可能加入1边 如果加入的0边<k<k<k,那么无解 两次操作之后若不连通也...原创 2019-12-15 16:42:44 · 242 阅读 · 0 评论 -
【题解】LuoGu3958:奶酪
原题传送门 可以O(n2logn)O(n^2logn)O(n2logn)并查集维护两点之间连通性 把起点和终点也看做两个点 Code: #include <bits/stdc++.h> #define maxn 1010 #define LL long long using namespace std; int f[maxn], n; LL x[maxn], y[maxn], z[ma...原创 2019-11-14 10:01:27 · 186 阅读 · 0 评论 -
【题解】CF500B:New Year Permutation
原题传送门 怎么说呢,输入就需要O(n2)O(n^2)O(n2)的题目有点那个了。。 祭出一个基础算法——并查集!!! 仿照缩点(强连通分量)的想法,如果一个点的集合,对于集合中的每一个点都能找到另一个集合中的点可以与之交换 那么这个点的集合可看成一个点,用并查集维护一下连通性 对于每一个位置,找当下(vis=0)(vis=0)(vis=0)最小的并且与这个位置联通的点输出 Code: #incl...原创 2019-08-22 17:52:24 · 187 阅读 · 0 评论 -
【题解】CF1027F:Session in BSU
原题传送门 这题我用并查集过了 看到范围1e9,所以先离散 然后每次把点对应的两个时间用并查集连条边 对于每个点的两个时间,分类讨论 两个时间都没选,暂时选小的那个,并用并查集把两个时间连起来 有一个选了,那么这次选剩下的那个,然后把这两个时间删掉(就是在并查集里把他们的祖先设置为0) 都选过了(表现为两个时间的祖先都为0),那么直接输出-1得了 为什么这题用并查集就搞定了呢,并查集的连边操作...原创 2019-07-25 09:55:24 · 213 阅读 · 0 评论 -
【题解】UVa1665:Islands
题目传送门 题目大意 输入一个n*m的矩阵,每个格子里都有一个[1,10^9]的正整数。再输入T个整数ti,对于每个ti,输出矩阵中大于ti的数组成了多少个联通块(上下左右相连,斜着不联通)。 有Z组数据 数据范围 1≤n,m≤1000 0≤t1≤t2≤···≤tT≤10^9 1≤T≤10^5 0≤Z≤20 【题解】 首先想到暴力方法,对于每个ti,进行遍历,时间复杂度O(ZT...原创 2018-08-22 15:47:42 · 336 阅读 · 1 评论