洛谷P3865.ST表
-
- i的取值为[1,n−2j+1]
- 从而推出j的取值为 j <= lg[n]
- 找区间最值时:
- 要找一段起始点L的可覆盖[L,R]的区间,即
- L + 2k - 1 <= R –> k <= lg[R-L+1] (区间长度)
- 同时起点为 D = R - 2k + 1 (起始点)
- 即f[D][k]
-
#include <bits/stdc++.h> using namespace std; const int N = 100010; int lg[N],f[N][20]; int n,m,x,y; int main() { cin>>n>>m; lg[1] = 0; // 求log2 for(int i=2;i<=n;i++) lg[i] = lg[i>>1] + 1; // 初始化f数组 for(int i=1;i<=n;i++) cin>>f[i][0]; //枚举指数j for(int j=1;j<=lg[n];j++) for(int i=1;i<=n-(1<<j)+1;i++) f[i][j] = max(f[i][j-1],f[i+1<<(j-1)][j-1]); for(int i=1;i<=m;i++) { cin>>x>>y; // k次方 int l = lg[y-x+1]; cout<<max(f[x][l],f[y-(1<<l)+1][l])<<endl; } return 0; }