题意:n个点,3种操作,强制在线:
1、连边(a, b)
2、跳到第k次操作之后的状态
3、询问(a, b) 是否连通
1和3操作是一个裸的并查集。
2操作?暴力加边删边显然不可行。可持久化?
我们发现并查集本质上就是一个数组。于是我们就是要将一个数组可持久化,支持查询每一个历史版本。
我们可以用主席树来维护。主席树的叶子节点保存并查集数组,非叶子节点什么也不做。这样我们就保存下了每一个版本,只是数组中每一个元素的访问时间是$O(\log n)$的。
需要注意的是不能只用路径压缩而不按秩合并。因为某一次路径压缩的复杂度是得不到保证的,我们不停退回执行某个卡路径压缩的操作就可以卡掉。事实上,使用了按秩合并之后,不用路径压缩复杂度也不会出现问题。
代码中有一些细节,在注释中标出。