介绍
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。
ST算法就是倍增的产物,ST算法能在O(nlogN)的预处理后,以O(1)的时间求出区间最值问题(当然也能求出其他问题)。思想上类似于动态规划,每次从上一次转移(状态转移方程看下面)。
思路
数列A是一个二维数组,A[i] [j]表示从第i个数字起长度为2的j次方的最大值。每次都成倍增长,公式
长度为2的j次方的最大值是左右俩半长度为2的j-1次方的子区间中较大的一个。
代码
预处理函数
1 | void ST(){ |
查询函数
1 | int ST_query(int l,int r){ |
例题
代码
1 |
|