题目描述
每天,农夫 John 的 n 头牛总是按同一序列排队。
有一天, John 决定让一些牛们玩一场飞盘比赛。他准备找一群在对列中为置连续的牛来进行比赛。但是为了避免水平悬殊,牛的身高不应该相差太大。John 准备了 q 个可能的牛的选择和所有牛的身高 h_i。他想知道每一组里面最高和最低的牛的身高差。
输入格式
第一行两个数 n,q。
接下来 n 行,每行一个数 h_i。
再接下来 q 行,每行两个整数 a 和 b,表示询问第 a 头牛到第 b 头牛里的最高和最低的牛的身高差。
输出格式
输出共 q 行,对于每一组询问,输出每一组中最高和最低的牛的身高差。
AC代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int n,m; 5 int f1[100100][50]; 6 int f2[100100][50]; 7 int l,r; 8 9 int main() 10 { 11 scanf("%d%d",&n,&m); 12 for (int i=1;i<=n;i++) 13 { 14 scanf("%d",&f1[i][0]); 15 f2[i][0]=f1[i][0]; 16 } 17 for (int j=1;(1<<j)<=n;j++) 18 for (int i=1;i+(1<<j)-1<=n;i++) 19 { 20 f1[i][j]=min(f1[i][j-1],f1[i+(1<<(j-1))][j-1]); 21 f2[i][j]=max(f2[i][j-1],f2[i+(1<<(j-1))][j-1]); 22 } 23 24 while (m--) 25 { 26 scanf("%d%d",&l,&r); 27 int k=log2(r-l+1); 28 int sum1,sum2,sum; 29 sum1=min(f1[l][k],f1[r-(1<<k)+1][k]); 30 sum2=max(f2[l][k],f2[r-(1<<k)+1][k]); 31 sum=abs(sum1-sum2); 32 printf("%d\n",sum); 33 } 34 return 0; 35 }