<题目链接>
题目大意:
给定一段序列,进行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