模板

预处理
时间复杂度\(O(n\log n)\)
区间最值查询
时间复杂度\(O(1)\)

int a[1010],st[1010][15],mini[1010];

void rmq_init(int n){
    for(int i=1;i<=n;i++) st[i][0]=a[i];
    for(int j=1;(1<<j)<=n;j++){
        for(int i=1;i+(1<<j)-1<=n;i++){
            st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
        }
    }
    for(int len=1;len<=n;len++){
        int k=0;
        while((1<<(k+1))<=len) k++;
        mini[len]=k;
    }
}

int rmq(int l,int r){
    int k=mini[r-l+1];
    return max(st[l][k],st[r-(1<<k)+1][k]);
}
posted @ 2020-07-04 21:14  fxq1304  阅读(22)  评论(0编辑  收藏  举报