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;
}
posted @ 2020-01-21 20:11  grass_lin  阅读(95)  评论(0编辑  收藏  举报