poj 3264 RMQ 水题
题意:找到一段数字里最大值和最小值的差
水题
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const int maxn=550; 9 const int INF=0x3f3f3f3f; 10 int n,m,t; 11 const int MAXN = 50010; 12 int dpMAX[MAXN][20],dpMIN[MAXN][20]; 13 int mm[MAXN]; 14 int cow[MAXN]; 15 //初始化RMQ, b数组下标从1开始,从0开始简单修改 16 void makemaxRMQ(int n,int b[]) 17 { 18 for(int i=1;i<=n;i++) 19 dpMAX[i][0]=b[i]; 20 for(int j=1;(1<<j)<=n;j++) 21 for(int i=1;i+(1<<j)-1<=n;i++) 22 dpMAX[i][j]=max(dpMAX[i][j-1],dpMAX[i+(1<<(j-1))][j-1]); 23 } 24 int rmqMAX(int s,int v) 25 { 26 int k=(int)(log(v-s+1.0)/log(2.0)); 27 return max(dpMAX[s][k],dpMAX[v-(1<<k)+1][k]); 28 } 29 void makeminRMQ(int n,int b[]) 30 { 31 for(int i=1;i<=n;i++) 32 dpMIN[i][0]=b[i]; 33 for(int j=1;(1<<j)<=n;j++) 34 for(int i=1;i+(1<<j)-1<=n;i++) 35 dpMIN[i][j]=min(dpMIN[i][j-1],dpMIN[i+(1<<(j-1))][j-1]); 36 } 37 int rmqMIN(int s,int v) 38 { 39 int k=(int)(log(v-s+1.0)/log(2.0)); 40 return min(dpMIN[s][k],dpMIN[v-(1<<k)+1][k]); 41 } 42 int main() 43 { 44 int i,j,k; 45 #ifndef ONLINE_JUDGE 46 freopen("1.in","r",stdin); 47 #endif 48 int q; 49 while(scanf("%d%d",&n,&q)!=EOF) 50 { 51 for(i=1;i<=n;i++) 52 { 53 scanf("%d",&cow[i]); 54 } 55 makemaxRMQ(n,cow); 56 makeminRMQ(n,cow); 57 for(i=1;i<=q;i++) 58 { 59 int a,b; 60 scanf("%d%d",&a,&b); 61 printf("%d\n",rmqMAX(a,b)-rmqMIN(a,b)); 62 } 63 } 64 return 0; 65 }