poj 3264 Balanced Lineup

题目链接: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\n",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 ///////////////////////////////////////////////////////////////////////////

posted on 2013-08-16 09:31  SCNU20102200088  阅读(119)  评论(0编辑  收藏  举报

导航