链接: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 }