ST表(sparse-table)是一种代码极其短的数据结构,RMQ(Range Minimum Qustion,范围最小值问题)专用。
RMQ就是给你一个序列不断询问你给定区间内的最小值。
ST表只能解决静态的RMQ,动态的需要用到万能的常数贼大的线段树。
ST表基本思想: d [ i ] [ j ] d[i][j] d[i][j] 表示以 i i i 为起点,长度为 2 j 2^j 2j 这一段区间中的最小值。
例如, d [ 3 ] [ 2 ] d[3][2] d[3][2] 就是 3 ∼ 3 + 2 2 3\sim 3+2^2 3∼3+22 区间,即 3 ∼ 7 3\sim 7 3∼7 区间的最小值。
ST表初始化代码:
for (register int i(1); i <= n; ++ i) d[i][0] = a[i] = read();
for (register int i(n); i >= 1; -- i)
for (register int j(1); i + (1 << j - 1) <= n; ++ j)
d[i][j] = max(d[i][j - 1], d[i + (1 << j - 1)][j - 1]);
由于本身ST表解决问题范围有很大的局限性上述代码可以直接背。
原理用一张图就可以说明了:
我们要算出 d [ i ] [ j ] d[i][j] d[i][j] 的值,也就是 i ∼ i + 2 j i\sim i+2^j i∼i+2j 区间内的最小/大值