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 }

 

posted @ 2015-03-20 22:44  miao_a_miao  阅读(1368)  评论(0编辑  收藏  举报