数据结构--ST表

ST表

与线段树相比,预处理复杂度同为O(nlogn),查询时间上,ST表为O(1),线段树为O(nlogn)
适合求区间最值问题,不适合求区间和

int a[maxn],st[maxn][20];

void rmq(int n)            //建立st表
{
    for(int j = 1; (1<<j) <= n; j++)
        for(int i = 1; i+(1<<j)-1 <= n; i++)
            st[i][j] = min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}

int ask(int l,int r)        //询问l,r区间
{
    int k = log2(r-l+1);
    return min(st[l][k],st[r-(1<<k)+1][k]);
}

预处理过程

预处理过程更好理解,比如说我要求从1开始的长度为8的的区间最小值
那么不就是可以分成4+4的两个区间吗,[1,4][5,8]
st[i][j-1],st[i+(1<<(j-1))][j-1]

查询过程

比如说我要查询[3,9]这个区间
首先求出区间长度等于7,然后log2(7)会等于2
也就是是说,把区间分成了4+4的区间,有一部分重合了[3,6][6,9]
st[l][k],st[r-(1<<k)+1][k]

参考博客

https://www.cnblogs.com/qq965921539/p/9608980.html

原文地址:https://www.cnblogs.com/hezongdnf/p/12239617.html