POJ 3264 Balanced Lineup(线段树维护区间最大值最小值)

版权声明:本文是博主乱写的文章,可以随便转载 https://blog.csdn.net/weixin_43768644/article/details/89390099

题目链接:http://poj.org/problem?id=3264

解题思路:

线段树维护一个区间的最大值,最小值,初始分别赋值为很小的负数,很大的正数

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
#define mid int m = l+r>>1
#define tl tree[rt<<1]
#define tr tree[rt<<1|1]
#define inf 0x3f3f3f3f

using namespace std;

const int N = 5e4+5;

struct node
{
    int minn,maxx;
    node(){minn=inf;maxx=-inf;}
}tree[N<<2];

node cmp(node a,node b)
{
    node temp;
    temp.maxx = max(a.maxx,b.maxx);
    temp.minn = min(a.minn,b.minn);
    return temp;
}

void push_up(int rt)
{
    tree[rt].maxx = max(tl.maxx,tr.maxx);
    tree[rt].minn = min(tl.minn,tr.minn);
}

node query(int L,int R,int rt,int l,int r)
{
    if (L<=l && r<=R){
        return tree[rt];
    }
    mid;
    node ans;
    if (L<=m) ans = cmp(ans,query(L,R,lson));
    if (R>m ) ans = cmp(ans,query(L,R,rson));
    return ans;
}

void build(int rt,int l,int r)
{
    if (l==r){
        int x;
        scanf("%d",&x);
        tree[rt].maxx = tree[rt].minn = x;
        return ;
    }
    mid;
    build(lson);
    build(rson);
    push_up(rt);
}

int main()
{
    int n,q;
    scanf("%d %d",&n,&q);
    build(1,1,n);
    int x,y;
    while (q--){
        scanf("%d %d",&x,&y);
        node sb = query(x,y,1,1,n);
        printf("%d\n",sb.maxx-sb.minn);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43768644/article/details/89390099