POJ 3264 Balanced Lineup 简单RMQ

题目:http://poj.org/problem?id=3264

给定一段区间,求其中最大值与最小值的差。

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <math.h>
 4 
 5 int dpMin[50010][31], dpMax[50010][31];
 6 
 7 int RMinQ(int l, int r)
 8 {
 9     int k = log(1.0 * r-l+1)/log(2.0);
10     return std::min(dpMin[l][k], dpMin[r-(1<<k)+1][k]);
11 }
12 
13 int RMaxQ(int l, int r)
14 {
15     int k = log(1.0 * r-l+1)/log(2.0);
16     return std::max(dpMax[l][k], dpMax[r-(1<<k)+1][k]);
17 }
18 
19 int main()
20 {
21     int n, m;
22     scanf("%d %d", &n, &m);
23     for(int i = 1; i <= n; i++)
24     {
25         scanf("%d", &dpMin[i][0]);
26         dpMax[i][0] = dpMin[i][0];
27     }
28     for(int j = 1; (1<<j) <= n; j++)
29     {
30         for(int i = 0; i + (1<<j) - 1 <= n; i++)
31         {
32             dpMax[i][j] = std::max(dpMax[i][j-1], dpMax[i+(1<<(j-1))][j-1]);
33             dpMin[i][j] = std::min(dpMin[i][j-1], dpMin[i+(1<<(j-1))][j-1]);
34         }
35     }
36     int x, y;
37     while(m--)
38     {
39         scanf("%d %d", &x, &y);
40         printf("%d\n", RMaxQ(x, y) - RMinQ(x, y));
41     }
42     return 0;
43 }
View Code

 

posted @ 2013-10-13 17:04  Anti-Magic  阅读(188)  评论(0编辑  收藏  举报