POJ 3264 Balanced Lineup(模板题)【RMQ】
<题目链接>
题目大意:
给定一段序列,进行q次询问,输出每次询问区间的最大值与最小值之差。
解题分析:
RMQ模板题,用ST表求解,ST表用了倍增的原理。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 7 typedef long long ll; 8 const int M=5e4+10; 9 int n,q; 10 ll maxsum[M][20],minsum[M][20]; 11 void RMQ(){ 12 int num=log((double)(n))/log(2.0); 13 for(int j=1;j<=num;j++){ 14 for(int i=1;i+(1<<j)-1<=n;i++){ 15 maxsum[i][j]=max(maxsum[i][j-1],maxsum[i+(1<<(j-1))][j-1]); 16 minsum[i][j]=min(minsum[i][j-1],minsum[i+(1<<(j-1))][j-1]); 17 } 18 } 19 } 20 int main(){ 21 scanf("%d%d",&n,&q); 22 for(int i=1;i<=n;i++){ 23 scanf("%lld",&maxsum[i][0]); 24 minsum[i][0]=maxsum[i][0]; 25 } 26 RMQ(); 27 while(q--){ 28 int x,y; 29 scanf("%d%d",&x,&y); 30 if(x>y)swap(x,y); 31 int k=log((double)(y-x+1))/log(2.0); 32 ll mx=max(maxsum[x][k],maxsum[y-(1<<k)+1][k]); 33 ll mn=min(minsum[x][k],minsum[y-(1<<k)+1][k]); 34 printf("%lld\n",mx-mn); 35 } 36 return 0; 37 }
2018-10-19
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。