ST表
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int MAXN=1e6; inline int read() { char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int Max[MAXN][21]; int Query(int l,int r) { int k=log2(r-l+1); return max(Max[l][k],Max[r-(1<<k)+1][k]); } int main() { int N=read(),M=read(); for(int i=1;i<=N;i++) Max[i][0]=read(); for(int i=1;i<=21;i++) for(int j=1;j+(1<<i)-1<=N;j++)//(1<<i) j加2的i次方 Max[j][i]=max(Max[j][i-1],Max[j+(1<<(i-1))][i-1]); for(int i=1;i<=M;i++) { int l=read(),r=read(); printf("%d\n",Query(l,r)); } return 0; }
这个题总感觉和Dp有辣么一点相似,首先Max[i][j]表示的是从i这个点到2的j次方这个点的这一段区间的最大值(或最小值),是不是有点Dp的感觉,对于静态查询的ST表,主要思路是把每个区间的最大或最小值提前预处理,在需要查询的时候,在相应区间内通过比较各个小区间的值来求出最终的答案。和二分的思想差不多,将大区间分为多个小区间,最终来更新答案。
//该题解代码 来源于洛古题解