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]