带权并查集
Luogu P2024
经典例题食物链。
题意:\(n\) 个动物,可能是三个物种之一,给出若干描述,形如两个动物是同类或是吃与被吃的关系,确定出矛盾的描述。
考虑建图,有边相连代表确定一个确定另一个关系,这是常用技巧。
物种体现在边权上,边权 \(0/1/2\) 表示在三个物种的三元环上,两个点之间要走多少步才能到达。
带权并查集,维护到根的路径上的边权和(模 3 加法群),即可判断描述的合法性。
并查集维护序列连通性
并查集可以维护图的连通性,我们拓展到序列上也是类似的。
并查集维护序列连通性一般是维护形如下一个满足某条件的位置是什么。
例题:Luogu P2391 白雪皑皑
题意是对序列进行若干次染色,求每个位置最后的颜色。
染色问题有技巧反着考虑,直接得到最终状态。
那么转换为,要快速找到每个位置下一个没有染色的位置,这符合并查集维护序列连通性的基本要求。
我们更改并查集 \(fa_i\) 的定义为上述所求。
倒序枚举询问,从前往后跳,每次将跳到的位置标记颜色,并更新当前的 \(fa_i \leftarrow fa_{i + 1}\),意义为当前位置染色完了,从下一个位置的答案更新。
注意到每个位置只会被跳一次,那么复杂度即为 \(O(n \alpha(n))\)。
其实我们相当于维护每个位置下一个没有染色的位置相当于维护了一个链表,更新也符合链表的操作,区别仅仅体现为路径压缩加快查询链表尾端。
可撤销并查集
并查集不能快速分裂,只能快速撤销。
可撤销并查集不能路径压缩,因为我们在路径压缩时实际上是损失了树的结构的信息,于是我们用按秩合并加快并查集速度。
用一个栈维护操作序,每次撤销就弹出栈顶并更新成原来的值。
可撤销并查集一般应用于类似线段树分治、操作分块等按时间轴分治的一些数据结构(与图相关的)
代码
没有什么并查集裸题,贴个可撤销带权并查集(来自线段树分治板子)