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\)的区间上,查连通块个数即可。

posted @ 2025-03-11 15:43  RandomShuffle  阅读(22)  评论(0)    收藏  举报