ST表详解
点了最短路的标签出了这题…
好吧一看就知道是用ST表,也想过用线段树,不过显然ST表更优秀。
我就先详讲ST的原理
我们先讲讲ST表是什么。
ST表是利用一种倍增的思想,也算是动态规划?
我们用一个二维数组st1 [ i ] [ j ] 表示以i为起点向右$ 2^j $的区间的最大值,
用一个二维数组st2 [ i ] [ j ]表示以i为起点向右$ 2^j $的区间的最小值。
那么我们来想怎么转移,对于一个区间像下面这样
st1 [ i ] [ j ]可以从 i~i+$ 2^{j-1} $和i+$ 2^{j-1} $~i+$ 2^j $转移过来,
st2也是一样的,只不过是取最大最小罢了。
讲完了制表,我们来讲讲怎么查询,我们要用到一个炒鸡好用的函数———>$ log_2 $
对于要查询的区间l,r,有可能(l-r)不是2的幂次,那么我们就需要合并
这样子的两个区间
那么我们就直接合并这个红色和绿色的区间,有些小天才可能会有疑问,
比如,这个重叠部分会有影响,答案是
完全没有
因为最大最小值是支持结合律的,那么我们也可以从这里推出ST表的一个性质,
ST表支持结合律的区间查询问题。
接下来就是快乐的代码时间
1 |
|