ST表适合 xoptx=x的形式的问题,如max(x,x)=x,gcd(x,x)=x,x&x=1等情况,可以求解区间最大,最小值等问题
以下是一个求解区间最大值的模板:
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5+9;
int f[N][20];//f[i][j]表示以i为左端点,2^k-1为右端点的最大值
int a[N];
void init_st(int n){//初始化st表
for(int i = 1;i<=n;i++){//初始化每一个值
f[i][0] = a[i];
}
for(int i = 1;i<=20;i++){//循环指数
for(int j = 1;j+(1<<i)-1<=n;j++){//循环左端点,要求j+2^i-1要小于等于n
f[j][i] = max(f[j][i-1],f[j+(1<<i-1)][i-1]);//找区间中最大的值
}
}
}
int query_st(int l,int r){//查询
int k = log2(r-l+1);//求出k
return max(f[l][k],f[r-(1<<k)+1][k]);//f[l][r] = max(f[l][k],f[r-2^k+1][k]);
}
int main(){
int n,q;
cin>>n>>q;
for(int i = 1;i<=n;i++){
cin>>a[i];
}
init_st(n);
for(int i = 1;i<=q;i++){
int l,r;
cin>>l>>r;
cout<<query_st(l,r)<<endl;
}
}