种类并查集
P2024 [NOI2001] 食物链
类似于超级源点,把\(x+n\)丢进集合里,相当于\(x\)对这个集合作了标记,方便维护
细节
注意\(x\to y\),对于\(y\to z\),会有\(z\to x\)
这里会出现自己和自己连边的情况,用\(fa[rt]=0\)的写法需要特判
P6008 [USACO20JAN] Cave Paintings P
主要考察思维,毕竟实现超简单
一开始想根据合并的位置高度划分出一棵树,发现做不了
其实只需要从下往上维护连通块,遇到连通块间的合并,将方案数相乘,最后每个连通块方案数加\(1\)即可
带权并查集
维护连续编号
P1196 [NOI2002] 银河英雄传说
对于询问,我们要在并查集操作的基础上维护该点到根的距离
考虑合并\(x,y\)时,若将\(y\)并到\(x\)末尾,则\(y\)所在链头到\(x\)的链头的距离为\(siz[x]+1\),用并查集的根维护链头,连一条权值为\(siz[x]+1\)的边即可
路径压缩和按秩合并都可实现
P3273 [SCOI2011]棘手的操作
所有操作都可以在线段树上实现,唯一的问题是编号不一定连续
由于每次操作的连通块都是一棵树,考虑变成编号连续的DFS序数组,问题变成合并两个编号连续的序列使新序列编号连续,直接将一个接到另一个末尾,重编号即可,用上面的做法就行了(其实直接启发式合并也能做)