RMQ (Range Minimum/Maximum Query),即区间最值问题。
对于长度为 n 的数列 A ,回答若干查询 RMQ(A,i,j)(i,j<=n) ,返回数列 A 中下标在 i,j 里的最大(小)值。
相关算法
朴素(搜索),时间复杂度: $O(n)-O(q×n)$ ,online
线段树,时间复杂度: $O(n)-O(q×\log n)$ ,online
ST(动态规划),时间复杂度: $O(n×\log n)-O(q)$ ,online
RMQ标准算法,先规约为 LCA ,再规约成约束 RMQ ,时间复杂度: $O(n)-O(q)$ ,online
ST 算法
假设当前题目要求区间最小值,我们令 dp[i][j] 代表从 i 开始,长度为 $2^j$ 这段区间的最小值。
于是便有: $dp[i][j]=\min(dp[i][j-1],dp[i+2^{j-1}][j-1])$
分析可知, $dp[i][j-1]$ 代表从 i 开始,长度为 $2^j$ 区间一半中的最小值,而 $dp[i+2^{j-1}][j-1]$ 即为区间的另一半。
最终(从下往上看):
dp[0][*]
dp[1][*]
dp[2][*]
dp[3][*]
dp[4][*]
dp[5][*]
dp[6][*]
dp[7][*]
dp[*][3]
1