ST表
其实是倍增的一种运用。
ST表所处理的信息要求具有可重复贡献性质,并且查询的东西要有结合律,比如最大值最小值之类的。
设\(f_{i,k}\)表示区间\([i,i+2^k-1]\)的信息,那么倍增起来是简单的:\(f_{i,k}=f_{i,k-1} \text{opt} f_{i+2^{k-1},k-1}\)。
查询时,记\(k=\log (r-l+1)\),那么答案就是\(f_{l,k}\text{opt} f_{r-2^k+1,k}\)。
预处理\(O(n\log n)\),查询\(O(1)\)。可以\(O(n)\)预处理\(\log\)。
ST表结合并查集
先进行一堆区间对应连边的操作(两个区间长度相等,连边\((l_1+i,l_2+i)\)),最后查询连通块个数。
首先连边的操作就很并查集。然后暴力是不可取的,因为有很多边是没必要的。于是用ST表优化连边过程。因为连边这个东西是可重复贡献且具有结合律的。
于是修改并查集,记\(f_{i,k}\)表示区间\([i,i+2^k-1]\)与哪一个同样长度为\(2^k\)的区间对应连边,这里\(f_{i,k}\)存的是左端点。
那么连边的操作就可以拆成两个长度为\(2^k\)的区间对应连边,在并查集上连一下就行。
最后查询连通块个数时,需要将长度为\(2^k\)的区间之间相互连边的信息下传到长度为\(2^{k-1}\)的区间上。那先查父亲,然后拆成前后两半对应相连即可。
最后下传到长度为\(2^0=1\)的区间上,查连通块个数即可。

浙公网安备 33010602011771号