http://poj.org/problem?id=3264
题意:给出n个数,还有q个询问,询问[l,r]区间里面最大值和最小值的差值。
思路:RMQ模板题,开两个数组维护最大值和最小值就行。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 #define N 50010 7 #define INF 0x3f3f3f3f 8 int dpmin[N][20], dpmax[N][20], n; 9 10 void Init() { 11 memset(dpmin, INF, sizeof(dpmin)); 12 for(int i = 1; i <= n; i++) { scanf("%d", &dpmin[i][0]); dpmax[i][0] = dpmin[i][0]; } 13 int limit = (int)(log(n) / log(2)); 14 for(int j = 1; j <= limit; j++) 15 for(int i = 1; i + (1 << j) - 1 <= n; i++) 16 dpmin[i][j] = min(dpmin[i][j-1], dpmin[i+(1<<(j-1))][j-1]), dpmax[i][j] = max(dpmax[i][j-1], dpmax[i+(1<<(j-1))][j-1]); 17 } 18 19 int Query(int l, int r) { 20 int k = (int)(log(r - l + 1) / log(2)); 21 return max(dpmax[l][k], dpmax[r-(1<<k)+1][k]) - min(dpmin[l][k], dpmin[r-(1<<k)+1][k]); 22 } 23 24 int main() { 25 int q; 26 while(~scanf("%d%d", &n, &q)) { 27 Init(); 28 while(q--) { 29 int l, r; scanf("%d%d", &l, &r); 30 printf("%d\n", Query(l, r)); 31 } 32 } 33 return 0; 34 }
时间: 2024-10-09 07:36:14