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)$ 啦