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 }

 

你可能感兴趣的:(poj)