RMQ sparse-table

来源:互联网 发布:淘宝新店铺 购买 编辑:程序博客网 时间:2024/06/05 17:09

  RMQ (Range Minimum/Maximum Query) 区间最小值问题。

  sparse-table算法复杂度O(nlogn)

  设d[i][j]表示从i开始,长度问哦2^j的一段元素中的最小值,等于前一半的最小值和后一半的最小值中小的那个,也就是d[i][j]=min(d[i][j-1],d[i+2^(j-1),j-1])。询问的时候找到2^k<=R-L+1的最大的k,也就是2^k大于区间长度的一半,这样从L开始长度为2^k和长度为2^k到R截止的这两个区间肯定覆盖了[L,R]。区间最小值就是min(d[L][k],d[R-2^k+1][k])。

  d一维大小为N,二维大小为lgN。

void RMQ_init(const vector<int>& A){    int N=A.size();    for(int i=0;i<N;i++) d[i][0]=A[i];    for(int j=1;(1<<j)<=N;j++)        for(int i=0;i+(1<<j)-1<N;i++) d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);}int RMQ(int L,int R){    int k=0;    while((1<<(k+1))<=R-L+1) k++;    return max(d[L][k],d[R-(1<<k)+1][k]);}


0 0