可持久化4--可持久化并查集

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可持久化4--可持久化并查集相关的知识,希望对你有一定的参考价值。

可持久化并查集

可持久化并查集 = 按秩合并并查集 + 可持久化数组

首先并查集不能采用路径压缩,这是因为一次findR操作中,fa数组的很多位置(u->ru)会发生修改,由于每次修改都需要在可持久化数组上复制产生log个新结点,空间复杂度过大。我们不希望每个版本的fa数组的差别太大,最好只有常数个位置改变。

启发式合并/按秩合并

当 merge(u,v) 时,找到ru,rv后,让 sz 小的接在sz大的下面:

if(sz[ru] > sz[rv]) swap(ru,rv);
fa[ru] = rv;
sz[rv] += sz[ru]

或者让高度(到叶子的最长距离)height 小的接在 height 大的下面:

if(height[ru] > height[rv]) swap(ru,rv);
fa[ru] = rv;
if(height[ru] == height[rv]) ++height[rv];

按sz合并一般称为启发式合并,按height合并一般称为按秩合并,二者的复杂度都是logN(每向上走1条边,身处的子树sz至少扩大1倍),且每次 merge 操作时,fa数组只有2个位置会发生修改(fa[ru]和sz[rv]),直接用可持久化下标线段树维护fa数组就可以实现可持久化。
空间复杂度是O(NlogN)
时间复杂度是O( N l o g 2 N Nlog^2N Nlog2N)

例题:

P3402 可持久化并查集
「NOI2018」归程

以上是关于可持久化4--可持久化并查集的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky

可持久化并查集

BZOJ-3673&3674可持久化并查集 可持久化线段树 + 并查集

可持久化并查集

半可持久化并查集

[BZOJ 3673]可持久化并查集 by zky