Balanced Lineup -POJ3264
题意:
告诉你n头奶牛的高度,然后给你一个区间,你需要求出这个区间最高的奶牛与最矮的奶牛之间相差多少
链接:http://poj.org/problem?id=3264
思路:
线段树区间查询,用两个查询函数,一个查最大值,另一个查最小值,将他们相减即可。
代码:
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> #include <cstdlib> using namespace std; const int MAXN=1e5+5; const int INF=0x7fffffff; typedef long long ll; int lazy[MAXN<<2],max_[MAXN<<2],min_[MAXN<<2]; //这里在push_up的时候我们将区间最大值和区间最小值都更新一下 void push_up(int node) { max_[node]=max(max_[node<<1],max_[node<<1|1]); min_[node]=min(min_[node<<1],min_[node<<1|1]); } void build(int node,int l,int r) { if(l==r) { scanf("%d",&max_[node]); min_[node]=max_[node]; return ; } int mid=(l+r)>>1; build(node<<1,l,mid); build(node<<1|1,mid+1,r); push_up(node); } int query1(int node,int l,int r,int x,int y) { if(x<=l&&y>=r) { return max_[node]; } int max1=0,min1=INF; int mid=(l+r)>>1; if(x<=mid)max1=max(max1,query1(node<<1,l,mid,x,y)); if(y>mid)max1=max(query1(node<<1|1,mid+1,r,x,y),max1); return max1; } int query2(int node,int l,int r,int x,int y) { if(x<=l&&y>=r) { return min_[node]; } int min1=INF; int mid=(l+r)>>1; if(x<=mid)min1=min(min1,query2(node<<1,l,mid,x,y)); if(y>mid)min1=min(query2(node<<1|1,mid+1,r,x,y),min1); return min1; } int main() { int n,k; scanf("%d%d",&n,&k); build(1,1,n); for(int i=1;i<=k;i++) { int a,b; scanf("%d%d",&a,&b); printf("%d\n",query1(1,1,n,a,b)-query2(1,1,n,a,b)); } return 0; }