Sparse Table(ST表)
通过O(n*logn)的预处理,以及O(n*logn)的空间,达到O(1)时间复杂度的查询操作
常用于对静态RMQ问题进行求解
- d[i][j]代表着这样一个区间的最值:左端点为 i ,长度为 2j 的区间,即区间**[i, i + 2j - 1]**
例如:
d[5][3] = min(d[5][2], d[9][2]),即意味着min(5, 12) = min( min(5…8), min(9…12) ),即区间5~12的最值
,等于 5~8的最值和9~12的最值
的最值
详细介绍
https://blog.youkuaiyun.com/guoyangfan_/article/details/81147253
https://www.luogu.com.cn/blog/zhouziheng666/qian-tan-st-biao
模版(最小值版本)
来源:https://www.cnblogs.com/autsky-jadek/p/7327416.html
int d[1000006][25];
int mn[1000006];
void rmq_init()
{
for(int i = 1; i <= n; i++)
d[i][0] = a[i];
for(int j = 1; (1 << j) <= n; j++)
for(int i=1;i+(1<<j)-1<=n;i++)
d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
for(int len=1;len<=n;++len){
int k=0;
while((1<<(k+1))<=len)
k++;
mn[len]=k;
}
}
int rmq(int L,int R)
{
int k=mn[R-L+1];
return min(d[L][k],d[R-(1<<k)+1][k]);
}
如果需要求出最大值,修改两个位置即可
d[i][j] = max(d[i][j-1], d[i + (1 << (j - 1))][j - 1]);
return max(d[L][k], d[R - (1 << k) + 1][k]);