ST表
简介
ST 表(Sparse Table,稀疏表)是用于解决 可重复贡献问题 的数据结构.
- 可重复贡献问题是指对于运算 \(opt\) 满足 \(x \ opt\ x=x\) 则对应的区间询问就是一个可重复贡献问题.例如,最大值有 \(max(x,x)=x\) 有 \(gcd(x,x)=x\) 所以 RMQ 和区间 GCD 就是一个可重复贡献问题.像区间和就不具有这个性质,如果求区间和的时候采用的预处理区间重叠了,则会导致重叠部分被计算两次,这是我们所不愿意看到的.另外,\(opt\) 还必须满足结合律才能使用 ST 表求解.
算法思路
倍增预处理,然后强行用长为 \(2^{log(r-l+1)}\) 的两端来处理,因为贡献可重,所以可以这样 \(O(1)\) 查询
代码
#include<bits/stdc++.h>
using namespace std;
const int Maxn=1e5+10;
int bit[20],st[Maxn][22];
int n,m;
int main()
{
cin>>n>>m;
bit[0]=1;
for(int i=1;i<=20;i++) bit[i]=2*bit[i-1];
for(int i=1;i<=n;i++) scanf("%d",&st[i][0]);
for(int j=1;j<=log2(n);j++)
for(int i=1;i<=n;i++)
{
if(i+bit[j]-1>n) break;
st[i][j]=max(st[i][j-1],st[i+bit[j-1]][j-1]);
}
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
int c=log2(y-x+1);
printf("%d\n",max(st[x][c],st[y-bit[c]+1][c]));
}
return 0;
}

浙公网安备 33010602011771号