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

st表

时间:2020-07-19 23:31:24      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:i++   最大值   class   二维数组   取整   处理   double   二维   影响   

st表是一个求RMQ问题的一种比线段树查询时间复杂度要小的算法

st表的主体是一个二维数组st[i][j],表示需要查询的数组的从下标i到下标i+2^j - 1的最值,这里以最大值为例

首先应该预处理log函数 因为向下取整所以可以这么来做:

int mlog[N];

void pre(int n){
    mlog[1]=0;
    mlog[2]=1;
    for(int i=3;i<=n;i++){
        mlog[i]=mlog[i/2]+1;
    }
}

然后就是初始化st表了

const int N=1e3+10;
int st[N][20];

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

最后就是查询了:

int query(int l,int r)
{
    int k = (int)(log((double)(r-l+1))-log(2.0));
    return max(st[l][k],st[r-(1<<k)+1][k]);
    //为了防止向下取整出现区间不完整的问题,那么就直接把l,r分成两个区间 一个是前半部分包含,一个是后半部分包含 虽然有重叠但是对求最值并没有影响
}

模板先写下,以后发现有错误或优化再改

st表

标签:i++   最大值   class   二维数组   取整   处理   double   二维   影响   

原文地址:https://www.cnblogs.com/kstranger/p/13340866.html

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