并查集
ModestCoder_
一个modest的coder
展开
-
【学习笔记】课题研究:并查集的维护
这个是我以前的一个总结并查集是用来维护连通性的,维护连通性的同时,我们还可以维护连通块里面其他的信息最普遍的用法是kruskal求最小生成树。这个是按照边长度排序,然后维护连通性然后是这道题求∑所有路径中边长max−min\sum 所有路径中边长max-min∑所有路径中边长max−min就先按照边长排序,然后边长满足递增或递减性,另外维护连通块元素的个数用来求方案数再来一道题题目转化成了序列,我就化归成上一道题目的链的形式水箱我们需要在连通块内维护高度,dp值这道题目把维护连通块信原创 2020-12-04 12:08:35 · 276 阅读 · 0 评论 -
【题解】LuoGu6503:DIFERENCIJA
原题传送门只要知道每个点作为最大/小值往左/右能扩展到哪里这个可以用单调栈处理O(n)O(n)O(n)解决但是我有另一种方法假如是一棵树,要求从某一点到另一点边权最大-边权最小加起来可以用类似kruskalkruskalkruskal的并查集写法详情见这道题目然后我把这道题化归成一条链的情况Code:#include <bits/stdc++.h>#define maxn 1000010#define LL long longusing namespace std;/原创 2020-10-25 18:15:27 · 174 阅读 · 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∗sizes2Code:#include <bits/stdc++.h>#define maxn 200010#define原创 2020-10-20 16:47:37 · 209 阅读 · 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 · 339 阅读 · 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 · 271 阅读 · 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 · 221 阅读 · 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 · 217 阅读 · 0 评论 -
【题解】CF1209D:Cow and Snacks
原题传送门对于同一只动物喜欢的两种点心,用并查集连边建好图后,对于一个点数>1的连通块,假设大小为xxx,用最优策略必定能满足x−1x-1x−1只动物,因为第一个来的必须取走两个,剩下的可以使得他们都只取走一个再转换一下思路,对于一个动物,如果他喜欢的两种点心尚未在同一个连通块里,那么他在最优策略下是一定能被满足的,那就答案+1,并且并查集合并然后我们求的是不能被满足的有多少Code:#include <bits/stdc++.h>#define maxn 200010us原创 2020-08-23 18:37:18 · 247 阅读 · 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 · 248 阅读 · 0 评论 -
【题解】LuoGu3958:奶酪
原题传送门可以O(n2logn)O(n^2logn)O(n2logn)并查集维护两点之间连通性把起点和终点也看做两个点Code:#include <bits/stdc++.h>#define maxn 1010#define LL long longusing namespace std;int f[maxn], n;LL x[maxn], y[maxn], z[ma...原创 2019-11-14 10:01:27 · 190 阅读 · 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 · 194 阅读 · 0 评论 -
【题解】CF1027F:Session in BSU
原题传送门这题我用并查集过了看到范围1e9,所以先离散然后每次把点对应的两个时间用并查集连条边对于每个点的两个时间,分类讨论两个时间都没选,暂时选小的那个,并用并查集把两个时间连起来有一个选了,那么这次选剩下的那个,然后把这两个时间删掉(就是在并查集里把他们的祖先设置为0)都选过了(表现为两个时间的祖先都为0),那么直接输出-1得了为什么这题用并查集就搞定了呢,并查集的连边操作...原创 2019-07-25 09:55:24 · 224 阅读 · 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 · 358 阅读 · 1 评论