1 条题解
-
0938936 LV 7 MOD @ 2019-08-20 22:19:45
RMQ标准模版题
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int n,m,a[200001],pm[200001][19]; int t2[19]; int main(){ register int i,j,l,r; scanf("%d %d",&n,&m); for(i=1;i<=n;i++){ scanf("%d",a+i); pm[i][0]=a[i]; } int lo=(int)log2(n)+1; t2[0]=1; for(i=1;i<=18;i++) t2[i]=1<<i; //t2[i]=2^i for(j=1;j<=lo;j++){ for(i=1;i<=n;i++){//pm[i][j]表示以i为左端点,长度为2^j的区间的最大值 pm[i][j]=max(pm[i][j-1],pm[min(i+t2[j-1],n)][j-1]); } } int ans,k; for(i=1;i<=m;i++){ ans=0; scanf("%d %d",&l,&r); k=(int)log2(r-l); ans=max(pm[l][k],pm[r-t2[k]+1][k]); printf("%d\n",ans); } return 0; }
- 1