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 }

 

posted @ 2013-04-18 20:38  Naix_x  阅读(141)  评论(0编辑  收藏  举报