ST 表并查集小记🐤

ST 表维护并查集,在 $O(n \log n)$ 时间内处理 $[l_1,r_1]$ 内每个点依次向 $[l_2,r_2]$ 中的点连边(共连 $r_1-l_1+1$ 条边)

首先变成对于 $l_1$ 和 $l_2$,对于 $i=0,1,\dots,2^k-1$,连边 $(l_1+i,l_2+i)$。

然后,采取以下形式:

void merge(int x,int y,int k)
{
    int fx=getfa(pos[x][k]),fy=getfa(pos[y][k]);
    if(fx==fy) return;
    fa[fy]=fx;
    
    if(k==0){
        return;
    }
    
    merge(x,y,k-1);
    merge(x+(1<<(k-1)),y+(1<<(k-1)),k-1);
}

这样就 $O(n \log n)$ 了。

为什么这样是对的呢?

一共有 $O(\log n)$ 层节点,每层有 $O(n)$ 个,最多就并 $O(n)$ 次,乘起来就是 $O(n \log n)$ 啦

posted @ 2022-02-20 20:50  CharlieVinnie  阅读(29)  评论(0编辑  收藏  举报