RMQ模板
f[i][j]表示从位置i开始,长度为2^j的一段区间的最值
以最小值为例:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<queue> 7 #include<map> 8 #include<string> 9 #define ll long long 10 #define inf 214748364 11 #define DB double 12 using namespace std; 13 inline int read() 14 { 15 int x=0,w=1;char ch=0; 16 while(ch<'0' || ch>'9'){if(ch=='-')w=-1;ch=getchar();} 17 while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); 18 return x*w; 19 } 20 int n,m; 21 int a[100002]; 22 int f[100002][30]; 23 void YU() 24 { 25 for(int i=1;i<=n;i++) 26 f[i][0]=a[i]; 27 for(int j=1;(1<<j)<=n;j++) 28 for(int i=1;i+(1<<j)-1<=n;i++) 29 f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]); 30 } 31 int MIN(int l,int r) 32 { 33 int k=log2(r-l+1); 34 return min(f[l][k],f[r-(1<<k)+1][k]); 35 } 36 int main() 37 { 38 n=read();m=read(); 39 for(int i=1;i<=n;i++) a[i]=read(); 40 YU(); 41 for(int i=1;i<=m;i++) 42 { 43 int l,r; 44 l=read();r=read(); 45 printf("%d ",MIN(l,r)); 46 } 47 return 0; 48 }
原理:意会
加油!