您的位置:首页 > 其它

poj 3264 Balanced Lineup

2013-08-16 09:31 239 查看
题目链接:http://poj.org/problem?id=3264

解题思路:RMQ (Range Minimum/Maximum Query).

///////////////////////////////////////////////////////////////////////////
//problem_id: poj 3264
//user_id: SCNU20102200088
///////////////////////////////////////////////////////////////////////////

#include <algorithm>
#include <iostream>
#include <iterator>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <map>
using namespace std;

///////////////////////////////////////////////////////////////////////////
typedef long long LL;
const double PI=acos(-1.0);
///////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////
//Add Code:
//Min[i][j]表示从i开始,长度为2^j的一段元素的最小值
//Max[i][j]表示从i开始,长度为2^j的一段元素的最大值
int h[50005],Min[50005][20],Max[50005][20];

int min(int a,int b){
return a<b? a:b;
}

int max(int a,int b){
return a>b? a:b;
}

void RMQ_init(int n){
int i,j;
for(i=1;i<=n;i++) Max[i][0]=Min[i][0]=h[i];
for(j=1;(1<<j)<=n;j++){
for(i=1;i+(1<<j)-1<=n;i++){
//递推求Min[i][j],Max[i][j]
Min[i][j]=min(Min[i][j-1],Min[i+(1<<(j-1))][j-1]);
Max[i][j]=max(Max[i][j-1],Max[i+(1<<(j-1))][j-1]);
}
}
}

int RMQ(int L,int R){
int k=0;
while((1<<(k+1))<=R-L+1) k++;  //求满足2^k<=R-L+1的最大的k
return max(Max[L][k],Max[R-(1<<k)+1][k])-min(Min[L][k],Min[R-(1<<k)+1][k]);
}
///////////////////////////////////////////////////////////////////////////

int main(){
///////////////////////////////////////////////////////////////////////
//Add code:
int n,q,a,b,i;
scanf("%d%d",&n,&q);
for(i=1;i<=n;i++) scanf("%d",&h[i]);
RMQ_init(n);
while(q--){
scanf("%d%d",&a,&b);
printf("%d\n",RMQ(a,b));
}
///////////////////////////////////////////////////////////////////////
return 0;
}

///////////////////////////////////////////////////////////////////////////
/*
Testcase:
Input:
6 3
1
7
3
4
2
5
1 5
4 6
2 2
Output:
6
3
0
*/
///////////////////////////////////////////////////////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: