POJ 3264 Balanced Lineup(RMQ模版)

题目链接

RMQ就是利用DP的思想,主要是解决求快速求区间最值的问题的。网上很多资料。

 1 #include <iostream>

 2 #include <cstring>

 3 #include <cmath>

 4 #include <cstdio>

 5 using namespace std;

 6 #define N  500000

 7 int p[N];

 8 int dpmin[22][N];

 9 int dpmax[22][N];

10 int bin[21];

11 void CL(int n)

12 {

13     int i,j;

14     for(i = 1;i <= n;i ++)

15     {

16         dpmin[0][i] = p[i];

17         dpmax[0][i] = p[i];

18     }

19     for(i = 1;bin[i] <= n;i ++)

20     {

21         for(j = 1;j + bin[i-1] <= n;j ++)

22         {

23             dpmin[i][j] = min(dpmin[i-1][j],dpmin[i-1][j+bin[i-1]]);

24             dpmax[i][j] = max(dpmax[i-1][j],dpmax[i-1][j+bin[i-1]]);

25         }

26     }

27 }

28 int rmqmax(int s,int t)

29 {

30     int k = log((t-s+1)*1.0)/log(2.0);//默认保留整数

31     return max(dpmax[k][s],dpmax[k][t - bin[k] + 1]);

32 }

33 int rmqmin(int s,int t)

34 {

35     int k = log((t-s+1)*1.0)/log(2.0);

36     return min(dpmin[k][s],dpmin[k][t - bin[k] + 1]);

37 }

38 int query(int s,int t)

39 {

40     return rmqmax(s,t) - rmqmin(s,t);

41 }

42 int main()

43 {

44     int n,m,i,x,y;

45     for (i = 0; i <= 21; ++i)

46     bin[i] = 1<<i;

47     while(scanf("%d%d",&n,&m)!=EOF)

48     {

49         for(i = 1;i <= n;i ++)

50         scanf("%d",&p[i]);

51         CL(n);

52         for(i = 1;i <= m;i ++)

53         {

54             scanf("%d%d",&x,&y);

55             printf("%d\n",query(x,y));

56         }

57     }

58     return 0;

59 }

 

你可能感兴趣的:(poj)