ST 表(RMQ 问题)

· · 算法·理论

\text{ST}

对于 \text{RMQ} (求区间最值)问题,若需要修改,则需要使用线段树。 若无需修改,则常常使用 \text{ST} 表,运行效率更高。

一、核心思想:

构建 \text{ST} 表的核心在于倍增和 DP。

如下以区间最大值为例讲解。

P1:一维 \text{ST} 表。

1. 定义:

f_{i,j} 表示以第 i 个数作为左端点,长度为 2^j 的区间中的最值。即 [i,i + 2^j -1] 的区间最值,区间总长度为 2^j

2. 转移(预处理):

转移类似于二分思想

如图,我们将一个长度为 2^j 的区间分成 2 个长度为 2^{j-1} 的子区间,整个区间的最值可由两个子区间得到。

按照 j 的顺序 DP,我们可以得到如下转移: \begin{cases} a_i\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (j = 0) \\ \max(f_{i,j-1},f_{i+2^{j-1},j-1})\ (j > 0) \end{cases}

其时间复杂度为 O(n \log n)

3. 询问:

同样的,基于二分思想,做到 O(1) 询问。

给出区间 [l,r],其长度为 len,如何将区间分成两部分?

根据 f 数组的定义,这两个区间的长度应为 2^kk = \left \lfloor \log_2(len) \right \rfloor

也就是分成 2 个长为 2^{\left \lfloor \log_2(len) \right \rfloor} 的子区间。

显然,这两个区间有重合。

左区间与右区间的长度和为 2^{k+1},区间长度 len= 2^k+a\ (a < 2^k),所以不会有元素遗漏。

\text{ans} = \max(f_{l,k},f_{r-2^k+1,k})

4. 优化:

令 $Log_0 = -1$,则: $$ Log_i = Log_{i/2}+1 $$ ### 5. 模板与例题: **[一维 ST 表模板](https://www.luogu.com.cn/paste/211ptavz)。** 1. [【模板】ST 表](https://www.luogu.com.cn/problem/P3865)。 2. [忠诚](https://www.luogu.com.cn/problem/P1816)。 3. [质量检测](https://www.luogu.com.cn/problem/P2251)。 4. [[SCOI2007] 降雨量](https://www.luogu.com.cn/problem/P2471)。 5. [奶牛排队](https://www.luogu.com.cn/problem/P6510)。 ## P2:二维 $\text{ST}$ 表。 **类似于一维 $\text{ST}$ 表。** ### 1. 定义: **$f_{i,j,a,b}$ 表示左上角为 $(i,j)$ ,右下角为 $(i+2^a -1,j+2^b -1)$ 的矩阵的最值。** ### 2. 转移(预处理): 考虑把询问矩阵划分为 $4$ 个可能重叠的子矩阵来转移。\ $f_{i,j,a,b} = \begin{cases} a_{i,j}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (a=b=0) \\ \max(f_{i,j,a-1,b},f_{i+2^{a-1},j,a-1,b})\ (a > 0) \\ \max(f_{i,j,a,b-1},f_{i,j+2^{b-1},a,b-1})\ \ (b > 0) \end{cases}

通俗地说,就是横着二分转移一遍,再竖着二分转移一遍。

3. 询问:

设:

k_1 = \left \lfloor \log_2(x_2 - x_1 + 1) \right \rfloor k_2 = \left \lfloor \log_2(y_2 - y_1 + 1) \right \rfloor

所以原询问矩阵可以看成 4 个长为 2^{k_1},宽为 2^{k_2} 的矩阵来转移(如图,标出了 4 个矩阵左上起点的坐标)。

则:

\text{ans} = \max(f_{x_1,y_1,k_1,k_2}, f_{x_2-2^{k1}+1,y_1,k_1,k_2}, f_{x_1,y_2-2^{k2}+1,k_1,k_2}, f_{x_2-2^{k1}+1,y_2-2^{k2}+1,k_1,k_2})

4. 模板与例题:

  1. [HAOI2007] 理想的正方形。