并查集
WerKeyTom_FTD
我是一只来自中山纪念中学高三的oier,请多多指教
展开
-
Idiot的间谍网络
题目大意及模型转换现在有n(n<=500000)个结点。 共m(m<=500000)次操作。 操作有三种: 1、一个没有父亲的结点x的父亲变为y。 2、所有x的祖先打上标记i。其中i满足之前已经出现过i-1次操作2。每个节点都可以有多个标记。 3、询问x是否有标记i。保证在此操作之前至少出现过i次操作2。离线大法好此题在线实在是麻烦。 我们可以发现,任何一个操作时形成的森林的父亲儿子顺序原创 2015-08-29 11:57:15 · 830 阅读 · 0 评论 -
[CF593D]行走
题目大意一颗树边上有边权,每次要么把一条边边权改小(不会改到1以下),要么给定权值v,让它沿一条路径整除下去,问最终变成多少。 所有权值均在10^18以内套路除以大于1的数最多除64次就会变成0。 边权只会改小,于是我们把边权为1的缩起来。 并查集实现即可。#include<cstdio>#include<algorithm>#include<cmath>#define fo(i,a,b原创 2016-11-02 21:46:48 · 408 阅读 · 0 评论 -
Dash speed
题目大意一颗树,每条边有边权[l,r]。 多次询问每次给定一个权值v,保留树上所有的边[l,r]使得l<=v且v<=r,然后求这片森林的最长简单路径长度。经典CDQ考虑分治算法 把每条边插入线段树区间中 然后一个权值的答案就是加入根到其对应叶子路径上经过的线段树节点上的所有边。 然后对线段树进行遍历,用并查集维护集合内的直径。因为要支持撤销,所以只能按秩合并不能路径压缩。 然后我跑的贼慢。原创 2016-11-05 16:15:22 · 734 阅读 · 0 评论 -
[bzoj4690]Never Wait for Weights
题目大意一堆未知数,之间有权值关系如x-y=z 每次给出关系或询问两个未知数的差权值并查集关系的维护显然用并查集。 每个节点维护如果父亲权值为0我的权值应该是多少即可。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int maxn=100000原创 2016-11-09 21:56:17 · 532 阅读 · 0 评论 -
[51nod1743]雪之国度
题目大意对于一个无向图,边有边权。对于每组询问u、v,如果可以找到两条从u到v不相交的路径,输出路径上边权最大值的最小值。维护边双我们考虑到,如果按照边权从小到大加边,第一次使得u和v处在同一个边双联通分量时我就求得了答案。 考虑一个很强的方法,用LCT或启发式合并维护森林,动态维护双连通分量。 因为不可能去持久化+二分求询问,我们可以再思考,每次将两个边双合并意味着一次集合合并,我们建一个新点原创 2016-11-16 20:40:59 · 738 阅读 · 0 评论 -
[bzoj1016][JSOI2008]最小生成树计数
题目大意给定n个点m条无向边的图G,求G的最小生成树个数,模31011。 其实有个特殊条件但我们的高端做法可以忽略。 n<=100,m<=1000矩阵树定理我们来思考一个图G所有最小生成树的同一个性质: 假如我加入所有边权<=w的边,任何生成树的联通情况一定是一致的。 脑补得证QAQ 或者你考虑反证+切割引理。 我们把边权相同的边当做一组边,每次在原来的基础上把这样边都加入。例如原本三个原创 2017-02-15 14:47:49 · 531 阅读 · 0 评论 -
港湾
题目描述放假啦! 小林和康娜来到了港口,看到有货船正在卸货。 港口十分狭窄,只有两个卸货区可以使用。每个卸货区上面可以堆积任意多个箱子。 每卸下来一个箱子,工作人员都会把这个箱子放在某个卸货区的顶端。之后,当车辆来运走这个箱子的时候,也必须保证这个箱子在某个卸货区的顶端。 港口今天一共运来了N个箱子,第i个箱子在时刻Ai被卸货,在时刻Bi被取走。康娜发现,每个箱子被取走时,都恰好位于所在卸货原创 2017-06-15 15:05:17 · 543 阅读 · 0 评论 -
[bzoj3060]Tour de Byteotia
题目大意给定一个n个点m条边的无向图,问最少删掉多少条边能使得编号小于等于k的点都不在环上。贪心把两边编号都>k的边先加入。 再把剩余的边加入,若形成环就删去新加边。 闭上眼睛感受当然最优。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int原创 2017-07-07 16:58:43 · 575 阅读 · 0 评论 -
[agc002d]Stamp Rally
前言简单套路题。题目大意一副连通图,每次询问从两个点x和y出发走出两条路径,希望至少经过一次的点数量等于z,经过的边最大编号最小是多少。简单题假如可以暴力,你可以按编号从小到大加入边,如果x和y不在一个联通块,能经过的点等于两个所在联通块大小的和,否则等于所在联通块大小,找到第一次大于等于z的位置。 不枚举也可以二分。 那不如整体二分吧,并查集采用按秩合并,好处是容易撤销。#include<cs原创 2017-10-21 11:44:06 · 676 阅读 · 0 评论 -
[agc011c]Squared Graph
前言很简单的计数套路。 没看过题解我有可能做复杂了。题意不想讲。做法先讲原图孤立点统计贡献,接下来讨论的所有点均不孤立。 我们想要统计一个联通块,可以统计特征点的个数。 即对于一个x.y,如果其是特征点,不存在与其联通的一个点t.u满足t<xt<x或x.z满足z<yz<y。 容易发现特征点第一维只能是原图中其所在联通块的最小编号点。 第二维如果也是最小编号点,显然也是可以的。 还有一种情原创 2017-10-12 16:49:25 · 811 阅读 · 0 评论 -
graph
题目大意维护一个图,若干操作每次加入一条边或删除一条已有边,每次操作后都输出该图是否为二分图。CDQ预处理每条边的存在时间。 考虑一个时刻,此时存在的边是所有存在时间区间包含该时刻的。对于每个时刻做的话,就是把所有包含该时刻的时间区间对应边加入并查集。 现在考虑把所有时刻一起做。 solve(l,r)表示解决[l,r]所有询问,先把所有时间区间刚好为[l,r]的加入并查集,对于剩余边,要么分到原创 2016-09-18 21:41:36 · 497 阅读 · 0 评论 -
Ztxz16学图论
题目大意给定一张图,每次询问编号在[l,r]的边连上后会形成多少联通块。离线做法我们考虑莫队。 考虑左端点所在的每一块,左端点到块末最多根号的距离,右端点是单调的。并查集容易添加,因此只保留块末到右端点的联通情况,每次暴力加上块末到左端点部分。在线做法把加入1~i条边,每条边权值设置为编号,所形成的最大生成树叫第i个版本。 [l,r]的答案=第r个版本中联通块数量+第r个版本中[1,l-1]存在原创 2016-09-04 07:49:03 · 890 阅读 · 0 评论 -
冷战
题目大意有两种操作,添加一条边或者询问两点在哪次操作后联通。 强制在线。辣鸡LCT一条边的权值是其的加入时间。 询问操作便是询问路径上的最大值。 我们不会维护边权,因此可以把边变成的点,向两端连边。 愉快被卡常。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace st原创 2016-07-07 20:36:07 · 600 阅读 · 0 评论 -
JZOJ2963Tree
题目大意及模型转换给定由N个结点组成的树。每次询问如果断掉第z条边并在x与y间连边n个结点是否连通。n<=200000,询问个数m<=2000000。 这道题比较水。。。 是输出NO,否输出YES(这是题目背景的问题)。考虑简化断了一条边后,很显然分成了两个连通块。添加一条新的边使得这两个连通块可以缩为一个连通块,那么这条边连接的两个结点必须分别在两个连通块中。现在问题变为了判断两个结点是否在同原创 2015-08-29 11:38:02 · 558 阅读 · 0 评论 -
beyond
题目大意给定两个长度为N字符串A与B,求出最大的L,使得A与B的前L个字符所组成的字符串循环同构。N<=2000000。推一推我们知道循环同构的一个特征:可以找到分界点分成两个字符串,然后交叉相同。例如aab与aba,我们可以把第一个字符串分割成a与ab,把第二个字符串分割成ab与a,那么他们交叉相同。 因此我们可以枚举A中分界点i,那么假设能找到B中分界点j,需要满足以下条件: 1、A的后缀i原创 2015-12-30 20:27:59 · 532 阅读 · 0 评论 -
[bzoj4326][NOIP2015]运输计划
题目大意树上有许多条路径,现在你可以将一条边的权值设为0,令所有路径的最大值最小。最长路径瓶颈我们注意到,设为0的边如果不在最长路径上,就不会减小答案。 因此我们可以找出最长路径,把原树转化为一条链+许多树的模型。 预处理出每个点i的from[i]表示由链上哪个点延伸的。 接下来我们可以枚举将链上哪条边变为0,则经过这条边的最长路径一定是最长链,我们只需维护出不经过这条边的最长路径。这个显然可原创 2015-11-13 21:29:56 · 1284 阅读 · 0 评论 -
[bzoj3673]可持久化并查集
题目大意实现一个可持久化并查集做法用可持久化线段树或平衡树之类的维护一个可持久化数组就好了。 这里我用了rope大法#include<cstdio>#include<algorithm>#include<ext/rope>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;using namespace __gnu_cxx;co原创 2016-04-13 19:52:41 · 912 阅读 · 0 评论 -
奇妙的数列
题目描述线性做法我们设left[i]表示最大的k#include<cstdio> #include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace原创 2016-04-11 14:09:03 · 584 阅读 · 0 评论 -
[bzoj4551][TJOI&HEOI2016]树
题目大意一颗树,除根节点外初始都是白点,根节点是黑点。 每次染黑一个结点或者询问一个结点的最近黑色祖先。倒序处理倒着做,于是每次是染白一个结点。 那么就并查集搞呀!#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using na原创 2016-05-10 19:29:21 · 1040 阅读 · 0 评论 -
[bzoj4569][SCOI2016]萌萌哒
题目大意有一个无前导0的n位数,有m个限制形如[l1,r1]=[l2,r2],问满足条件的数有多少种,答案模10^9+7。倍增我们用ST表,f[i,j]表示[i,i+2^j-1]这一段。 那么初始时每一段单独成一个集合。 对于一个限制可以拆成log 份,然后进行集合合并。 然后呢,如果任意f[s,t]和f[i,j]属于同一集合,那么f[s,t-1]与f[i,j-1]以及f[s+2^(t-1)-原创 2016-05-06 19:23:52 · 2152 阅读 · 0 评论 -
[bzoj2733][HNOI2012]永无乡
题目大意有n个点,初始时有一些边。 每次操作要么加一条边,要么询问一个点所在联通块数值第k大的点。水题联通情况并查集维护,每个连通块再对应一个权值线段树。 合并连通块就是线段树合并。#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int maxn原创 2016-06-26 10:23:14 · 1029 阅读 · 0 评论 -
[UER #1C]Dzy Loves Graph
题目大意有n个结点,初始没有边。m个操作,操作类型有三: 1、a与b之间连一条长度为i的边(i为操作编号) 2、删除比边权最大的k条边。 3、撤销刚刚执行的操作,保证撤销的不是撤销操作。 每次操作后输出最小生成树所有边权和。可持久化并查集有许多版本,于是我们发现版本之间形成树的结构,为什么? 加入的边越来越大,因此删除操作相当于跳到k级祖先,每次添加操作就在下面加一个儿子,所以是树的结构。原创 2016-07-03 08:26:27 · 699 阅读 · 0 评论 -
[arc076f]Exhausted?
前言你们都会hall定理推广版本。 但是我没用hall定理做啊。题目大意一个二分图,X部每个点i连了Y部的[1,Li]和[Ri,m]。 求n-最大匹配。做法考虑到二分图最大匹配等于最小覆盖。 最优方案小我们一定是选择了Y部的一个前缀和一个后缀,剩余不能因此得到覆盖的X部点要选上。 假如我们枚举选了Y部的前缀l,假设Y部选的后缀是r,那么选的点为l+m−r+1+n−∑ni=1[Li<=l]∗[原创 2017-11-02 17:37:12 · 726 阅读 · 0 评论