
并查集
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj4195 [Noi2015]程序自动分析(并查集+Hash表)
并查集小水题~ 需要Hash表/map/离散化一下 一开始没排序…sb了。。。#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 200011inline char gc(){ static char buf[1<&...原创 2018-06-25 13:18:53 · 258 阅读 · 0 评论 -
bzoj2959 长跑(lct+并查集)
一个边双联通分量中的点我们是可以都取走的。于是我们把边双联通分量缩成一个点,那么我们就得到了一个森林,每次询问就相当于是求树上路径权值和。至于如何缩双联通,我们用并查集来缩。find2(fa2[x])表示x缩完环以后真正的点。再用一个并查集fa1来维护一下原图的连通性。每次加边无非三种情况: 1、x,y在原图中不连通,则我们把这两棵树link起来。 2、x,y在新图中已经是一个点了,忽略。 3原创 2018-02-17 17:27:49 · 675 阅读 · 0 评论 -
bzoj4998 星球联盟(lct+并查集)
做完bzoj2959,再做这道题就显得比较简单了。我们要维护一个边双联通分量大小。用并查集来缩点即可。原创 2018-02-17 17:56:16 · 467 阅读 · 0 评论 -
hdu3726 Graph and Queries(离线+平衡树启发式合并)
我们把操作离线,删边操作就变成了合并。每个连通块维护一棵splay,合并时把sz小的暴力插到sz大的里面去即可。复杂度O(nlog2n)O(nlog^2n),为什么呢,因为一个点x被暴力插入一次,则它的sz至少大了一倍,所以一个点最多暴力插入logn次。 tips:ins之后要转到跟呀转到跟!原创 2018-02-24 14:16:42 · 433 阅读 · 0 评论 -
USACO2018FEB Gold
A.snowboots(离线+贪心+并查集) 都按S排序以后,每次把不能走的染黑,如果任意一段连续的黑色个数小于< d的话我就可以通过,否则不行。可以用并查集来维护最大子段和。复杂度O(nlogn)O(nlogn)B.dirtraverse(树+搜索+递推) 首先处理出选1做当前目录的答案,然后可以直接递推得到选儿子y做当前目录的答案,f[y]=f[1]−(len[y]+1)∗sz[y]+3∗(原创 2018-02-26 15:56:17 · 766 阅读 · 0 评论 -
uoj79 一般图最大匹配(带花树)
写着感觉好麻烦呀。。。心力交瘁。。。大概就是缩花,花套花想想就迷。。。推荐几个学习的好地方: http://www.csie.ntnu.edu.tw/~u91029/Matching.html 2015 年中国国家队候选队员论文集,陈胤伯,《浅谈图的匹配算法及其应用》原创 2018-01-27 18:07:08 · 504 阅读 · 0 评论 -
bzoj3669 [Noi2014]魔法森林(并查集+lct)
把所有边按a值从小到大排序。不断往里加边,维护连通性,如果成环,查询目前x,y路径上的b的最大值,如果我当前边的b比最大值还大,则肯定不往里加。否则替换掉最大的b值那条边,连通性不变。如果1和n已经联通,就更新答案,用目前1,n路径上的b的最大值+当前边的a值来更新。这样为什么是正确的呢?考虑你这次替换了一条边进去,分两种情况 1.这条边在目前1~n的路径上,则显然这条边的a值是最大的a值。原创 2018-01-31 18:13:47 · 516 阅读 · 0 评论 -
bzoj1180 [CROATIAN2009]OTOCI(lct)
因为没有删边操作,可以直接拿并查集维护连通性。为啥不能直接带权并查集呢?因为还有修改点权。#include #include #include using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 30010inline int read(){ int x=0,f=1;char ch原创 2018-01-31 17:14:55 · 367 阅读 · 0 评论 -
bzoj4358 permu(莫队+线段树||莫队+并查集+分块||K-D tree)
很久以前的坑=,= 题意:给你一个排列序列,每次询问问l,r区间内最长的值域连续段长度。范围50000,长得就像莫队-,-。怎么转移呢,首先有一个比较明显的做法,用数值建一棵线段树,维护最大子段和。这样的复杂度是(nn−√logn)(n\sqrt nlogn)的,但是常数巨大,不太好卡过去。。。按堆建树,从下往上推,蜜汁分块大小,居然卡过去了。欣慰,附上代码。然而正解是这样的:我们对每一个数都记一原创 2017-08-03 11:55:50 · 1095 阅读 · 0 评论 -
USACO 2018JAN Silver
A.lifeguards(线段树+枚举) 枚举删掉哪条线段,离散化+线段树维护线段覆盖长度qaq B.rental(贪心+二分+枚举) 枚举留几头牛,贪心算收益qaq C.mootube(并查集+暴力) 类似最大生成树的并查集+暴力处理出dis,然后暴力回答询问qaq原创 2018-01-21 22:27:18 · 1531 阅读 · 0 评论 -
poj1703 Find them, Catch them(类似gang)
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 100010inline int read(){ int x=0,f=1;char ch=getchar(); whi原创 2018-01-12 08:35:55 · 325 阅读 · 0 评论 -
bzoj4144 [AMPPZ2014]Petrol(spfa+贪心+离线+并查集)
首先对于每个点i,记离它最近的加油站为from[i],我们可以贪心的发现,在加油站a到加油站b的最短路(只经过非加油站)上,所有的点的from一定是这样的:前一部分都是a,后一部分都是b。也就是说只存在这样的一条边,他的两端点的from不同,记这条边的边权为w,则a到b的最短路为dis[a]+w+dis[b]。(dis[i]表示i到离它最近的加油站的距离)于是我们以所有加油站为源点,做一遍多源最短路原创 2017-12-16 16:52:24 · 393 阅读 · 0 评论 -
CF763E Timofey and our friends animals(线段树+并查集/lct+BIT/瞎搞)
官方正解给的是线段树+并查集,好毒瘤呀!写的我心神俱疲呀orz 我是每个节点维护左边K个点和右边K个点的连通性,还有连通块的个数。然后每次合并两个节点的时候,就暴力枚举K^2条边来并查集维护。再更新对结果的l和r。然后每次查询的时候就直接合并logn个节点即可。当节点的区间长度不足k时太毒瘤啦!【我写的简直太丑了】复杂度O(nlognk2+qlognk2)O(nlognk2+qlognk2)O(...原创 2018-03-15 11:40:12 · 1124 阅读 · 0 评论 -
bzoj2733 [HNOI2012]永无乡(并查集+线段树合并/启发式平衡树合并)
每个连通块维护一棵权值线段树即可。动态开点,查询时去线段树上爬即可。然后每次合并集合的时候把线段树也合并了。关于线段树合并:传送门 upd:也可以启发式合并平衡树,每次把sz小的直接塞到sz大的中去。线段树合并#include <cstdio>#include <cstring>#include <algorithm>#include <...原创 2018-02-14 16:51:44 · 402 阅读 · 0 评论 -
bzoj3624 [Apio2008]免费道路(图论+并查集)
我们首先把必须加入的0边加进去(把所有1边全加进去,然后此时还能加进去的0边就是必须加的0边) 如果必须加的0边个数>K则无解。否则继续加0边直到K条。 如果加不到K条也无解。然后再加1边,能加就加进去即可。 不连通也是无解。 解决。#include <bits/stdc++.h>using namespace std;#define ll long long#...原创 2018-06-16 14:00:39 · 215 阅读 · 0 评论 -
CF986C AND Graph(按位+图论)
给定一个大小为m的集合,每一个数都是0 ~ 2n−12n−12^n-1的,如果两个数x,y满足x&y==0就连一条无向边,问这m个数连成的图有多少个连通块。考虑x&y==0,那么x一定是~y的子集。于是枚举并查集维护连通性即可。 然而复杂度很要命,需要你剪枝qaq,比如说预处理一个i及i的子集是否存在,如果已经联通就不再往下做等等 复杂度O(n2n)O(n2n)O(n2^n...原创 2018-05-31 11:04:42 · 1827 阅读 · 0 评论 -
bzoj3007 拯救小云公主(二分答案+并查集)
二分答案以后就是不能经过若干圆,能否从(1,1)走到(n,m) 只要(1,m),(n,1)不连通即可。 并查集维护一波即可。 复杂度O(n2logw)O(n2logw)O(n^2logw)#include <bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3f#define ll long long#defi...原创 2018-06-13 23:05:39 · 688 阅读 · 0 评论 -
uoj236 【IOI2016】railroad(欧拉图+最小生成树)
首先我们对每一个速度建一个点,然后对于每一个路段(s,t),建边s->t。这样我们就是求可以在这张图中添加一些边,要求经过每条边恰好一次。我们添加一条(inf,1)的边,这样就是要求把这张图变成欧拉图。考虑这样一个区间[x,x+1][x,x+1][x,x+1] , 只有满足s≤x,t≥x+1s≤x,t≥x+1s≤x,t≥x+1的边与满足t≤x,s≥x+1t≤x,s≥x+1t≤x,s≥...原创 2018-06-20 21:54:13 · 944 阅读 · 0 评论 -
bzoj4229 选择(lct+并查集维护边双)
倒着做,加边,维护边双。 lct+并查集。类似:portal 见一次不会一次系列qaq原创 2018-04-27 14:52:36 · 438 阅读 · 0 评论 -
bzoj4569 [Scoi2016]萌萌哒(并查集+倍增)
考虑暴力做法,就是每次把对应位置都用并查集合并了。最后答案就是9*10^(连通块个数-1)。然而这样太暴力了,怎么优化呢? 我们考虑倍增的思想,用id[j][i]这个点表示j…j+(1< < i)-1这一段。我们每次合并两个对应区间时,变成合并logn个对应区间。 最后再从上往下推到i=0.即如果id[x][i]和id[y][i]联通,则id[x][i-1],id[y][i-1]也联通,id[x原创 2018-04-27 09:38:20 · 361 阅读 · 0 评论 -
bzoj1077 [SCOI2008]天平(并查集+暴力)
首先把有相等关系的都并成一个,方便讨论。 然后直接O(n2)O(n^2)暴力处理出每一个点的取值范围。 如果既有前驱又有后继,那这个点一定是2,然后暴力更新其他已知点。 未更新值的点可能有多种取值,根据连边关系限定。 然后暴力枚举C,D,以及A,B,C,D的取值,判断是否合法。以及是否答案为唯一。原创 2018-04-21 22:42:49 · 305 阅读 · 0 评论 -
CF455C Civilization(树的直径+并查集)
首先求出每个连通子树的直径,注意记在根上,可以有向的合并。 然后就是并查集了。合并两个连通子树,使得新直径最小,考虑新直径如果横跨两块,则最优的显然是把两块的直径中点连起来。 所以合并之后直径的最小值就是max(max(d1,d2),(d1+1)/2+(d2+1)/2+1)原创 2018-04-14 21:52:17 · 424 阅读 · 0 评论 -
bzoj5188 [Usaco2018 Jan]MooTube(离线+并查集)
给定一棵n个点的树(n=1e5),有边权, 两点间距离定义为两点路径上的 边权最小值。m个询问(m=1e5),k,v, 询问对于点v,距离>=k的点有多少个(不含v) 离线+并查集,按k从大到小做, 此时与v连通的所有点均为答案。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#d原创 2018-03-13 09:27:22 · 818 阅读 · 0 评论 -
USACO2018JAN Gold
A.mootube(离线+并查集) 给定一棵n个点的树(n=1e5),有边权,两点间距离定义为两点路径上的边权最小值。m个询问(m=1e5),k,v,询问对于点v,距离>=k的点有多少个(不含v)离线+并查集,按k从大到小做,此时与v连通的所有点均为答案。 我已经菜到想不出这种题了qaqB.lifeguards(树+贪心) 给定一棵有根树,wrx一开始在根,每个叶子节点都是出口,你可以在每个出原创 2018-01-27 00:26:22 · 1172 阅读 · 0 评论 -
bzoj5194 [Usaco2018 Feb]Snow Boots(离线+贪心+并查集)
都按S排序以后,每次把不能走的染黑,如果任意一段连续的黑色个数小于< d的话我就可以通过,否则不行。可以用并查集来维护最大子段和。复杂度O(nlogn)#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;#define ll long long#define原创 2018-03-04 14:37:58 · 693 阅读 · 0 评论 -
NOIP2017提高组D2
D2 T1.cheese并查集 T2.treasure状压dp(爆搜) T3.phalanx线段树(暴力),只会80分。原创 2017-11-22 21:39:39 · 485 阅读 · 0 评论 -
CF400D Dima and Bacteria(并查集+Floyd)
首先判断是否可行,把0边链接的点都合并起来,看每一种类的所有点是不是都在一个集合内。然后缩成500个点,跑Floyd即可。原创 2017-11-19 21:22:02 · 324 阅读 · 0 评论 -
bzoj1594 [Usaco2008 Jan]猜数游戏(二分答案+线段树/并查集)
首先考虑如何判定是否有不合法的,我们把这些区间信息按照v从大到小排序,按顺序做,每次相当于在区间中找一个位置,填下这个v,还要满足这个v不能填在已经做过的区间中(否则那些区间的最小值就是这次的v了,显然小于了本来应该是的v),那么我们就每次判断是否能填后,用一条线段覆盖本次区间,表示这个区间不能填比我小的了。v相等的若干区间怎么办呢?我们求出这些区间的交,如果交为空,则显然不可能,否则v一定要填在交原创 2017-11-06 14:18:02 · 879 阅读 · 0 评论 -
luogu1196 [noi2002]galaxy银河英雄传说(带权并查集)
挺裸的带权并查集。。。注意一下N应该是300000,而不是30000原创 2017-09-05 14:50:50 · 403 阅读 · 0 评论 -
bzoj1529 [POI2005]ska Piggy banks(并查集)
水题一道。原创 2017-09-05 14:03:28 · 377 阅读 · 0 评论 -
bzoj1050 [HAOI2006]旅行comf(并查集)
要求路径上最大边与最小边比值的最小值。我们知道,如果固定最小值,最大值越接近最小值,他们的比值越小。因此我们可以采用类似bzoj3454的方法,把所有边从小到大排序,枚举最小值,再枚举最大值,用并查集维护,当s和t连通时,便是此最小值的最优答案。复杂度O(m2)O(m^2)原创 2017-09-05 13:56:22 · 319 阅读 · 0 评论 -
luogu1525【2010提高】关押罪犯(贪心+并查集)
首先按怒气值从大到小排序,我们贪心的尽量让怒气值最大的两人不在一起。 直到没有办法了,两人只能在一起时,输出答案。 怎么维护呢?类似团伙那道题,让我的敌人和我的敌人在一起。直到两者已经在一个集合中时,输出答案。也可以像食物链那道题,做一个带权并查集,d[i]=0表示i与fa[i]不是敌人,1表示i与fa[i]是敌人。原创 2017-09-05 11:25:40 · 385 阅读 · 0 评论 -
bzoj1202 狡猾的商人(带权并查集)
还是那句话,注意方向原创 2017-09-04 17:10:14 · 346 阅读 · 0 评论 -
poj1182 食物链 (带权并查集)
题解网上有很多。。。不想说了。。。考场上像我这种蒟蒻是想不出来的吧。。。提醒大家一点,按照向量运算去理解带权并查集的路径压缩会非常有帮助哟原创 2017-09-04 16:39:44 · 348 阅读 · 0 评论 -
bzoj1116 [POI2008]CLO(记录带环连通块)
基本同bzoj1854 还是如果一个块内有环,则这一个块内都可以满足,否则必定有一个点不满足。(这题题意有毒,读了半天才明白 是你可以把一些边变成单向边,其他的可以删去。)原创 2017-09-04 15:18:26 · 317 阅读 · 0 评论 -
poj2588 snakes (并查集判断连通性+几何)
最重要的写在最前面:这题要用c++编译器才能过!!!默认的G++过不了!!!坑害多少生灵,╭(╯^╰)╮ 首先要发现,如果上下边界联通则一定过不去。我们把上边界叫做0,下边界叫做n+1,与他们相交的合并进一个集合,两圆相交的也合并进一个集合。看上下边界是否在同一个集合里即可判断能否通过。然后是找最大值的问题。先看起点的最大值,什么样的圆才会影响我们的起点最大值呢?至少,这个圆要与起点线(即左边界)原创 2017-09-04 14:26:06 · 675 阅读 · 0 评论 -
poj1611 the suspects(并查集)
并查集裸题。原创 2017-09-04 12:29:04 · 270 阅读 · 0 评论 -
poj2236 wireless network(并查集)
每次修好一台,暴力O(n)扫一遍,把能和他直接通讯的合并起来。复杂度O(nm)吧原创 2017-09-04 11:31:40 · 344 阅读 · 0 评论 -
bzoj1370 [Baltic2003]Gang团伙(并查集)
对于朋友,我们直接合并两人所在的集合。对于敌人,我们分别合并一人与另一人的敌人。我们只需再记下每个人的一个敌人即可。最后统计有多少个连通块便是答案原创 2017-09-04 11:12:00 · 423 阅读 · 0 评论 -
bzoj3362[Usaco2004 Feb]Navigation Nightmare 导航噩梦(带权并查集)
把询问离线了,按时间顺序排序,做好询问时间以前的。用带权并查集维护,因为要求曼哈顿距离,所以我们记录dx[i]数组表示x[fa[i]]-x[i],注意是有方向的。dy[i]同理。合并时处理好方向问题。还是那句话,画向量图来帮助你思维。 有没有哪位神犇能告诉我usaco green是个什么分级么。。跟gold pt不一样?原创 2017-09-05 16:25:19 · 492 阅读 · 0 评论