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 }