紧接着囚犯的是伪可持久化并查集(动态并查集)
同样的,这里也用到了镜像的思想,以多开一倍空间来存储自己的另外一种状态。从而来实现动态的并查集father[i]=i+n;father[i+n]=i+n; 就是这样,i与i’(i+n)同时指向了i+n这样一个虚拟id,接下会发生什么就可以模拟了。如果x union y,则x指向y的虚拟id,重指y时并不会改变x及曾是x的子节点因并查集而变到f[y]只是指向一个虚拟id的事实,从而一切的动态移除,合并,统计就可以在并查集强大的空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N次合并M查找的时间复杂度为O(MAlpha(N))的处理下解决了。
模拟镜像
先来三个点1,2,3
创建它们的镜像
操作1 union 1 与 2(本来应该这样)
实际上是这样
这样union 3 与 1,move 2 to another point
就会这样(虚线代表本身的union对象,实线表示路径压缩后的union对象)
move