码迷,mamicode.com
首页 > 其他好文 > 详细

RMQ板子

时间:2019-02-24 21:32:19      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:线段树   需要   turn   pre   最大值   rmq   静态   cpp   i++   

对于RMQ这种静态最值询问, 用线段树的话查询过慢, 一般用ST表预处理后O(1)查询, 下以最大值查询为例, 这里假定$n$不超过5e5

void init() {
    Log[0] = -1;
    REP(i,1,n) f[0][i] = a[i], Log[i]=Log[i>>1]+1;
    REP(j,1,19) for (int i=1;i+(1<<j-1)<=*s; ++i) {
        f[j][i] = max(f[j-1][i],f[j-1][i+(1<<j-1)]);
    }
}
int RMQ(int l, int r) {
    if (l>r) return -INF;
    int t = Log[r-l+1];
    return max(f[t][l],f[t][r-(1<<t)+1]);
}  

 若需要求最大值的下标, 可以这样写 

void init() {
    Log[0]=-1;
    REP(i,1,n) f[0][i] = i, Log[i]=Log[i>>1]+1;
    REP(j,1,19) for (int i=1; i+(1<<j)-1<=n; i++) {
        int x = f[i][j-1], y = f[i+(1<<(j-1))][j-1];
        f[i][j]=a[x]>a[y]?x:y;
    }
}
int RMQ(int l, int r) {
    if (l>r) return -1;                                                                 
    int k = Log[r-l+1];
    int x = f[l][k], y = f[r-(1<<k)+1][k];
    return a[x]>a[y]?x:y;
}

 

RMQ板子

标签:线段树   需要   turn   pre   最大值   rmq   静态   cpp   i++   

原文地址:https://www.cnblogs.com/uid001/p/10427935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!