其他分享
首页 > 其他分享> > RMQ——ST表

RMQ——ST表

作者:互联网

ST表

ST表是一种解决RMQ问题的强有力工具,

可以做到O(nlogn)预处理,O(1)查询。

st[i][j] 表示区间 [i, i + 2 ^ j - 1] 的最大值。

初值 st[i][0] = a[i]。

状态转移 st[i][j] = max(st[i][j - 1],  st[i + 2 ^ ( j - 1)][j - 1]).。

初始化:

inline void init(){
    for(int  i = 1; (1 << i) <= n; i ++)
        for(int j = 1; j + (1 << i) - 1 <= n; j ++){
            st[j][i] = max(st[j][i - 1], st[j + (1 << (i - 1))][i - 1]);
        }
}

 查询:

对于每个询问,拆成 [l, l + 2 ^ k - 1], [r - 2 ^ k + 1, r], k = log2(r - l + 1) 下取整

inline int query(int l, int r){
    int k = log2(r - l + 1);
    return max(st[l][k], st[r - (1 << k) + 1][k];
}

 

标签:RMQ,log2,int,max,st,ST
来源: https://www.cnblogs.com/William-Sg/p/15863031.html