随笔分类 -  并查集

摘要:显然可以用可持久化并查集实现。考虑更简单的做法。如果没有撤销操作,用带撤销并查集暴力模拟即可,复杂度显然可以均摊。加上撤销操作,删除操作的复杂度不再能均摊,但注意到我们在删除时就可以知道他会不会被撤销,所以遇到一个要被撤销的删除操作时,直接求出去掉k条边后的MST即可。 阅读全文
posted @ 2019-04-19 21:14 Gloid 阅读(218) 评论(0) 推荐(0)
摘要:首先一般化的将下水道和塌陷看成一个东西。注意到在从源点出发的所有需要使用某条下水道的最短路径中,该下水道只会被使用一次,该下水道第一个被访问的点相同,且只会在第一个访问的点使用该下水道。这个第一个访问的点显然就是正常dij过程中,该下水道第一个被取出的点。 于是在dij过程中,取出了某个点进行更新后 阅读全文
posted @ 2019-01-15 23:50 Gloid 阅读(741) 评论(0) 推荐(1)
摘要:题面甚至没给范围,由数据可得n<=200。容易想到二分答案,暴力枚举某集合的价值,2-SATcheck一下即可。这样是O(n4logn)的。 2-SAT复杂度已经是下界,考虑如何优化枚举。稍微改一下,不妨从大到小枚举较大的集合价值(即枚举边),另一个集合二分答案,同样O(n4logn)。 看起来没什 阅读全文
posted @ 2019-01-02 00:32 Gloid 阅读(265) 评论(0) 推荐(0)
摘要:按海拔从大到小合并建出kruskal重构树,这样就能知道开车能到达哪些点,对这些点到1的最短路取min即可。最难的部分在于多组数据的初始化和数组大小的设置。 阅读全文
posted @ 2018-12-26 01:54 Gloid 阅读(181) 评论(0) 推荐(0)
摘要:如果某个格子的积水量超过了该格子的某个挡板高度,那么挡板另一端的积水量就会与其相同。看起来是一个不断合并的过程,考虑并查集。枚举深度,维护每个连通块内的方案数,深度超过某挡板高度时,将两端的连通块合并,即方案数相乘。再加上该连通块均为当前深度的这种方案。这样复杂度即为O(nmHα)或O(n2m2α) 阅读全文
posted @ 2018-12-06 19:40 Gloid 阅读(210) 评论(0) 推荐(0)
摘要:即要求动态维护边双。出现环时将路径上的点合并即可。LCT维护。具体地,加边成环时makeroot+access+splay一套把这段路径提出来,暴力dfs修改并查集祖先,并将这部分与根断开,视为删除这些点,以后就以并查集中的祖先代替这些点。access时更新每个点的父亲。注意由于之前的删点操作,判断 阅读全文
posted @ 2018-12-03 12:54 Gloid 阅读(305) 评论(0) 推荐(0)
摘要:带权并查集按秩合并即可维护。 阅读全文
posted @ 2018-11-06 13:39 Gloid 阅读(176) 评论(0) 推荐(0)
摘要:显然可以用LCT维护kruskal重构树。或者启发式合并维护kruskal重构树的倍增数组虽然多了个log也不一定比LCT慢吧。 当然这里的kruskal重构树几乎只是把树上的边权换成了点权,并不重要。 我们要查询的是树上两点间路径边权最大值。显然要并查集按秩合并一波。然后……并查集的树高就是log 阅读全文
posted @ 2018-11-06 12:49 Gloid 阅读(253) 评论(0) 推荐(0)
摘要:考虑边只有一种权值的简化情况。那么当且仅当两点可以通过边权<=x的边连通,且连通块内最大边权为x时,两点间存在路径max为x的路径。可以发现两种权值是类似的,当且仅当两点可以通过边权1<=x且边权2<=y的边连通,且连通块内最大边权1为x、最大边权2为y时,两点间存在路径max为(x,y)的路径。 阅读全文
posted @ 2018-11-02 18:00 Gloid 阅读(206) 评论(0) 推荐(0)
摘要:似乎是弱化的qtree3。树剖什么的非常无脑。考虑离线。并查集维护每个点的最近打标记祖先,倒序处理,删除标记时将其与父亲合并即可。 阅读全文
posted @ 2018-10-31 22:40 Gloid 阅读(163) 评论(0) 推荐(0)
摘要:判断网格图中某两点是否被割开,可以将割边视为边区域视为点,转化为可切割这两点的区域是否连通。于是每次判断使两个区域连通后是否会形成环(边界视为连通),若是则说明被两点被割开。并查集维护。 阅读全文
posted @ 2018-10-29 17:30 Gloid 阅读(150) 评论(0) 推荐(0)
摘要:注意到只有增加点/合并的操作。这些操作都可以用线段树完成,于是线段树合并一发就好了。注意乘积大小直接比较肯定会炸,取个对数即可。数据中存在重边。 阅读全文
posted @ 2018-10-29 09:59 Gloid 阅读(206) 评论(0) 推荐(0)
摘要:考虑根号分块。对于<√3e5的模数,每加入一个数就暴力更新最小值;对于>√3e5的模数,由于最多被分成√3e5块,查询时对每一块找最小值,这用一些正常的DS显然可以做到log,但不太跑得过。考虑并查集在序列上的奇技淫巧。加点不太能做,考虑离线改成删点。并查集维护下一个未删除的点即可。 阅读全文
posted @ 2018-10-26 22:17 Gloid 阅读(169) 评论(0) 推荐(0)
摘要:两个位置i和j上的元素不能被放进同一个栈的充要条件显然是存在k使i<j<k且ak<ai<aj。由此在保证合法的情况下贪心地放就是正确的了。 至于如何判断,可以记一下后缀最小值,每找到一对就利用补集并查集合并。放的时候要求与该栈所有元素不排斥且与另一个栈的元素不存在强制同栈的关系。 怎么感觉远古时代n 阅读全文
posted @ 2018-10-16 02:55 Gloid 阅读(207) 评论(0) 推荐(0)
摘要:对合并过程建树。然后只需要按照时间顺序考虑每个反应就行了,时间顺序根据lca的深度确定。 阅读全文
posted @ 2018-09-29 13:17 Gloid 阅读(191) 评论(0) 推荐(0)
摘要:kruskal重构树本质就是给并查集显式建树来替代可持久化并查集。将边按困难度从小到大排序后建出该树,按dfs序建主席树即可。查询时跳到深度最浅的满足在该重要度下已被合并的点,在子树内查询第k大。 阅读全文
posted @ 2018-09-25 00:17 Gloid 阅读(147) 评论(0) 推荐(0)
摘要:容易发现只要图中有非链部分则无解。剩下就非常简单了。 阅读全文
posted @ 2018-09-20 19:07 Gloid 阅读(115) 评论(0) 推荐(0)
摘要:容易发现x nand x=not x。并且使用这个性质有x and y=not(x nand y)=(x nand y)nand(x nand y)。也就是说nand运算可以作为not和and运算使用。并且显然not和and运算可以表示nand运算,那么两者等价。事实上这就可以表示所有位运算了。 那 阅读全文
posted @ 2018-09-06 22:55 Gloid 阅读(137) 评论(0) 推荐(0)
摘要:比较难想到的是将题目中的要求看做异或。那么有ai,j^ai+1,j^ai,j+1^ai+1,j+1=1。瞎化一化可以大胆猜想得到a1,1^a1,j^ai,1^ai,j=(i-1)*(j-1)&1。也就是说,确定第一行和第一列的颜色,就可以确定整个矩阵。现在如果没有已填的格子的限制,答案就是2n+m- 阅读全文
posted @ 2018-08-30 18:22 Gloid 阅读(197) 评论(0) 推荐(0)
摘要:一个显然的暴力是用并查集记录哪些位之间是相等的。但是这样需要连nm条边,而实际上至多只有n条边是有用的,冗余过多。 于是考虑优化。使用类似st表的东西,f[i][j]表示i~i+2^j-1与f[i][j]~f[i][j]+2^j-1连接起来了,也就是把这一大段看成一个点所建立的并查集。那么每个限制只 阅读全文
posted @ 2018-08-03 13:27 Gloid 阅读(153) 评论(0) 推荐(0)