1. RMQ问题
RMQ(Range Minimum/Maximum Query)
区间最小/大值问题。给定一个 n n n 个元素的数组 A 1 , A 2 , A 3 , … , A n A_1, A_2, A_3, \dots, A_n A1,A2,A3,…,An ,设计一个数据结构,支持区间查询操作 QueryMin(L,R)
:计算 min { A L , A L + 1 , … , A R } \min \{A_L, A_{L+1}, \dots, A_R\} min{
AL,AL+1,…,AR} ,也可以支持 QueryMax(L,R)
(注意:这里的区间都是离散意义下的,只包含整数)。
如果每次用循环计算显然不够快, m m m 次的查询需要 O ( m n ) O(mn) O(mn) 的时间复杂度。而前缀和的思想也不能提升效率,因为这不是一个可加性信息。怎么办呢?
2. Sparse-Table
实践中最常用的是 Tarjan
的 Sparse-Table
算法,或者说ST表(稀疏表),一种简单的数据结构,主要用于处理RMQ问题。它使用倍增的思想,可以 O ( n log n ) O(n\log n) O(nlogn) 预处理, O ( 1 ) O(1) O(1) 查询,而且常数很小。最重要的是,这个算法非常还写,不易写错。
ST表使用一个二维数组 dp[][]
,对于范围内的所有 dp[a][b]
,先进行预处理,计算并存储 min i ∈ [ a , a + 2 b ) ( A i ) \min\limits_{i\in[a,\ a+2^b)}(A_i) i∈[a, a+2