A12 ST表 RMQ问题
视频链接:A12 ST表 RMQ问题_哔哩哔哩_bilibili


// ST表 RMQ O(nlogn) #include<bits/stdc++.h> #define rep(i,l,r) for(int i=l;i<=r;++i) using namespace std; const int N=1e5+5; int n,m; int f[N][22]; //f[i][j]表示起点为i,长度为2^j的区间最大值 int lg[N]; //lg[x]表示区间长度的对数 int main(){ scanf("%d%d",&n,&m); rep(i,1,n) scanf("%d",&f[i][0]); rep(i,2,n) lg[i]=lg[i>>1]+1; rep(j,1,lg[n]) //枚举区间长度的对数 rep(i,1,n-(1<<j)+1) //枚举区间起点为 i。终点为 i+2^j-1 f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]); //后半区起点为 i+2^(j-1)。[2,5]=[2,3]+[4,5] rep(i,1,m){ int l,r; scanf("%d%d",&l,&r); int j=lg[r-l+1]; //区间长度的对数 printf("%d\n",max(f[l][j],f[r-(1<<j)+1][j])); //后段起点为 r-2^j+1。[1,6]~[1,4]+[3,6] } }
练习:
Luogu P2880 [USACO07JAN] Balanced Lineup G
浙公网安备 33010602011771号