题目链接:http://poj.org/problem?id=3264
解题思路:RMQ (Range Minimum/Maximum Query).
1 /////////////////////////////////////////////////////////////////////////// 2 //problem_id: poj 3264 3 //user_id: SCNU20102200088 4 /////////////////////////////////////////////////////////////////////////// 5 6 #include <algorithm> 7 #include <iostream> 8 #include <iterator> 9 #include <iomanip> 10 #include <cstring> 11 #include <cstdlib> 12 #include <string> 13 #include <vector> 14 #include <cstdio> 15 #include <cctype> 16 #include <cmath> 17 #include <queue> 18 #include <stack> 19 #include <list> 20 #include <set> 21 #include <map> 22 using namespace std; 23 24 /////////////////////////////////////////////////////////////////////////// 25 typedef long long LL; 26 const double PI=acos(-1.0); 27 /////////////////////////////////////////////////////////////////////////// 28 29 /////////////////////////////////////////////////////////////////////////// 30 //Add Code: 31 //Min[i][j]表示从i开始,长度为2^j的一段元素的最小值 32 //Max[i][j]表示从i开始,长度为2^j的一段元素的最大值 33 int h[50005],Min[50005][20],Max[50005][20]; 34 35 int min(int a,int b){ 36 return a<b? a:b; 37 } 38 39 int max(int a,int b){ 40 return a>b? a:b; 41 } 42 43 void RMQ_init(int n){ 44 int i,j; 45 for(i=1;i<=n;i++) Max[i][0]=Min[i][0]=h[i]; 46 for(j=1;(1<<j)<=n;j++){ 47 for(i=1;i+(1<<j)-1<=n;i++){ 48 //递推求Min[i][j],Max[i][j] 49 Min[i][j]=min(Min[i][j-1],Min[i+(1<<(j-1))][j-1]); 50 Max[i][j]=max(Max[i][j-1],Max[i+(1<<(j-1))][j-1]); 51 } 52 } 53 } 54 55 int RMQ(int L,int R){ 56 int k=0; 57 while((1<<(k+1))<=R-L+1) k++; //求满足2^k<=R-L+1的最大的k 58 return max(Max[L][k],Max[R-(1<<k)+1][k])-min(Min[L][k],Min[R-(1<<k)+1][k]); 59 } 60 /////////////////////////////////////////////////////////////////////////// 61 62 int main(){ 63 /////////////////////////////////////////////////////////////////////// 64 //Add code: 65 int n,q,a,b,i; 66 scanf("%d%d",&n,&q); 67 for(i=1;i<=n;i++) scanf("%d",&h[i]); 68 RMQ_init(n); 69 while(q--){ 70 scanf("%d%d",&a,&b); 71 printf("%d ",RMQ(a,b)); 72 } 73 /////////////////////////////////////////////////////////////////////// 74 return 0; 75 } 76 77 /////////////////////////////////////////////////////////////////////////// 78 /* 79 Testcase: 80 Input: 81 6 3 82 1 83 7 84 3 85 4 86 2 87 5 88 1 5 89 4 6 90 2 2 91 Output: 92 6 93 3 94 0 95 */ 96 ///////////////////////////////////////////////////////////////////////////