RMQ问题

RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题 。

解决这类问题常用的是tarjan的Sparse_table算法,即稀疏表算法。
它的预处理时间是O( nlogn ),但是查询时间为O( 1 )
Balanced Lineup

#include 
#include
#include 
#include
#define maxn 50005
using namespace std;
int dmin[maxn][16],dmax[maxn][16];
int rmq_min(int l,int r)
{
    int k=0;
    while((1<<(k+1))<=r-l+1) k++;//如果2^(k+1)<=r - l + 1,那么k还可以加1
    //可以保证2^k最大等于区间长度,那么范围查询不越界,且左右半边至少无空隙
    return min(dmin[l][k],dmin[r-(1<

你可能感兴趣的:(RMQ问题)