洛谷P2880 [USACO07JAN] Balanced Lineup G
题目描述
每天,农夫 John 的 n () 头牛总是按同一序列排队。
有一天,John 决定让一些牛们玩一场飞盘比赛。他准备找一群在队列中位置连续的牛来进行比赛。但是为了避免水平悬殊,牛的身高不应该相差太大。John 准备了 q () 个可能的牛的选择和所有牛的身高
(
,
)。他想知道每一组里面最高和最低的牛的身高差。
输入格式
第一行两个数 n,q。
接下来 n 行,每行一个数 。
再接下来 q 行,每行两个整数 a 和 b,表示询问第 a 头牛到第 b 头牛里的最高和最低的牛的身高差。
输出格式
输出共 q 行,对于每一组询问,输出每一组中最高和最低的牛的身高差。
输入输出样例
输入 #1
6 3
1
7
3
4
2
5
1 5
4 6
2 2
输出 #1
6
3
0
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q,a,b,h;
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>q;ll len=ceil(log2(n));vector<vector<ll>>h_max(n+5,vector<ll>(len+5,0));vector<vector<ll>>h_min(n+5,vector<ll>(len+5,0));for(ll i=1;i<=n;i++){cin>>h;h_max[i][0]=h;h_min[i][0]=h;}for(ll j=1;(1<<j)<=n;j++){for(ll i=1;i+(1<<j)-1<=n;i++){h_max[i][j]=max(h_max[i][j-1],h_max[i+(1<<(j-1))][j-1]);h_min[i][j]=min(h_min[i][j-1],h_min[i+(1<<(j-1))][j-1]);}}while(q--){cin>>a>>b;ll x=floor(log2(b-a+1));ll top=max(h_max[a][x],h_max[b-(1<<x)+1][x]);ll bottom=min(h_min[a][x],h_min[b-(1<<x)+1][x]);cout<<top-bottom<<"\n";}return 0;
}