算法笔记 - ST表

定义

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;
}

猜你喜欢

转载自www.cnblogs.com/Goobye/p/12221338.html