首页 > 编程语言 > 详细

算法笔记 - ST表

时间:2020-01-21 13:50:05      阅读:65      评论:0      收藏:0      [点我收藏+]

定义

st[ i,j ] 表示左端点为 i ,长为( 1<< j )的区间最值

原理

(1)构造:由于ST表表示的区间长度为2^j,可以分割成左右两部分,每个点为起点都有 O(logN) 个区间,预处理总时间、空间复杂度都为 O(NlogN)。
技术分享图片
(2)查询:求任意区间的最值都可以按照下图拆分,注意这里的区间可能会出现互相覆盖的情况,所以ST表只适用于维护允许区间重叠的性质,复杂度O(1)
技术分享图片

实现

区间最大值为例

int a[MAXN],mxv[MAXN][23];
int quemx(int l,int r)
{
    int k = log2(r - l + 1);
    return max(mxv[l][k], mxv[r - (1 << k) + 1][k]);
}
signed main()
{
    int n;cin>>n;
    rpp (i,n) cin>>a[i],mxv[i][0]=a[i];
    
    for(int j=1;(1<<j)<=n;++j)
        for(int i=1;i+(1<<j)-1<=n;++i)
            mxv[i][j] = max(mxv[i][j - 1], mxv[i + (1 << (j - 1))][j - 1]);

    return 0;
}

算法笔记 - ST表

原文:https://www.cnblogs.com/Goobye/p/12221338.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!