POJ 3264 Balanced Lineup(ST模板)

链接:http://poj.org/problem?id=3264

题意:给n个数,求一段区间L,R的最大值 - 最小值,Q次询问

思路:ST表模板,预处理区间最值,O(1)复杂度询问

AC代码:

 1 #include<iostream>
 2 #include<vector>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<set>
 8 #include<cstring>
 9 #include<queue>
10 #include<map>
11 using namespace std;
12 typedef long long ll;
13 const int maxn = 50005;
14 const int logn = 21;
15 int Log[maxn];
16 int MIN[maxn][logn];
17 int MAX[maxn][logn];
18 int cow[maxn];
19 int n,q;
20 void pre(){
21     Log[1] = 0;
22     Log[2] = 1;
23     for(int i = 3;i<=n;i++){
24         Log[i] = Log[i/2] + 1;
25     }
26 }
27 void st(){
28     for(int i = 1;i<=n;i++){
29         MIN[i][0] = MAX[i][0] = cow[i]; 
30     }
31     for(int j = 1;(1<<j)<=n;j++){
32         for(int i = 1;i+(1<<j)-1<=n;i++){
33             MAX[i][j] = max(MAX[i][j-1],MAX[i+(1<<(j-1))][j-1]);
34             MIN[i][j] = min(MIN[i][j-1],MIN[i+(1<<(j-1))][j-1]); 
35         }
36     }
37 }
38 int main()
39 {
40     scanf("%d%d",&n,&q);
41     for(int i = 1;i<=n;i++){
42         scanf("%d",&cow[i]);
43     }
44     pre();
45     st();
46     while(q--){
47         int A,B;
48         scanf("%d%d",&A,&B);
49         int s = Log[B-A+1];
50         int range_max = max(MAX[A][s],MAX[B-(1<<s)+1][s]);
51         int range_min = min(MIN[A][s],MIN[B-(1<<s)+1][s]);
52         cout<<range_max-range_min<<endl;
53     }
54     return 0;
55 }

猜你喜欢

转载自www.cnblogs.com/AaronChang/p/12192992.html