题意:有n头牛,输入他们的身高,求某区间身高的极值的差(max-min),
用RMQ模板,同时构造求极大值和极小值的两个数组。
1 //poj3264 2 #include <iostream> 3 #include <string> 4 #include <cstring> 5 #include <queue> 6 #include <vector> 7 #include <cstdio> 8 #include<cmath> 9 using namespace std; 10 const int maxn=50005; 11 int s[maxn]; 12 int dpmin[maxn][20];//存小值 13 int dpmax[maxn][20];//存大值 14 int rmq_min(int l,int r)//查询最小值 15 { 16 int k=log2(r-l+1); 17 return min(dpmin[l][k],dpmin[r-(1<<k)+1][k]); 18 } 19 int rmq_max(int l,int r)//查询最大值 20 { 21 int k=log2(r-l+1); 22 return max(dpmax[l][k],dpmax[r-(1<<k)+1][k]); 23 } 24 int main() 25 { 26 int n,q; 27 scanf("%d%d",&n,&q); 28 for(int i=1;i<=n;i++) 29 scanf("%d",&s[i]); 30 for(int i=1;i<=n;i++) 31 { 32 dpmin[i][0]=s[i];//赋初值 33 dpmax[i][0]=s[i]; 34 } 35 for(int j=1;(1<<j)<=n;j++) 36 { 37 for(int i=1;i+(1<<j)-1<=n;i++) 38 { 39 dpmin[i][j]=min(dpmin[i][j-1],dpmin[i+(1<<j-1)][j-1]);//构建 40 dpmax[i][j]=max(dpmax[i][j-1],dpmax[i+(1<<j-1)][j-1]); 41 } 42 } 43 while(q--) 44 { 45 int x,y; 46 scanf("%d%d",&x,&y); 47 printf("%d\n",rmq_max(x,y)-rmq_min(x,y));//大减小就是结果 48 } 49 return 0; 50 }