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

 

你可能感兴趣的:(poj)