Loading

POJ 3264:Balanced Lineup(RMQ模板题)

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 }

 

posted @ 2017-01-23 20:37  Shadowdsp  阅读(197)  评论(0编辑  收藏  举报