POJ 3264 Balanced Lineup(模板题)【RMQ】

<题目链接>

题目大意:

给定一段序列,进行q次询问,输出每次询问区间的最大值与最小值之差。

解题分析:

RMQ模板题,用ST表求解,ST表用了倍增的原理。

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstdio>
 4 using namespace std;
 5 const int MAX=50005;
 6 typedef long long ll;
 7 ll maxn[MAX][20],minn[MAX][20];
 8 int n,q;
 9 void RMQ(){
10     int num=log(double(n))/log(2.0);
11     for(int j=1;j<=num;j++)
12     for(int i=1;i+(1<<j)-1<=n;i++){
13         maxn[i][j]=max(maxn[i][j-1],maxn[i+(1<<(j-1))][j-1]);
14         minn[i][j]=min(minn[i][j-1],minn[i+(1<<(j-1))][j-1]);
15     }
16 }
17  
18 int main(){
19     scanf("%d%d",&n,&q);
20     for(int i=1;i<=n;i++){
21         ll a;scanf("%lld",&a);        
22         maxn[i][0]=minn[i][0]=a;
23     }
24     RMQ();
25     int x,y;
26     while(q--){
27        scanf("%d%d",&x,&y);
28         if(x>y)swap(x,y);
29         int k=log(double(y-x+1))/log(2.0);
30         ll mx=max(maxn[x][k],maxn[y-(1<<k)+1][k]);
31         ll mn=min(minn[x][k],minn[y-(1<<k)+1][k]);
32         printf("%lld\n",mx-mn);
33  
34     }
35     return 0;
36 }

2018-10-19

猜你喜欢

转载自www.cnblogs.com/00isok/p/9819760.html