码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3264 Balanced Lineup 【线段树】

时间:2018-09-23 18:12:36      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:font   name   ++   include   eof   ons   val   net   ref   

 <题目链接>

题目大意:

求给定区间内最大值与最小值之差。

解题分析:

线段树水题,每个节点维护两个值,分别代表该区间的最大和最小值即可。

 

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define Lson rt<<1,l,mid
#define Rson rt<<1|1,mid+1,r
#define INF 0x3f3f3f3f
const int N =50000+5;
int n,m;
int a[N];
struct Tree{
    int mn,mx;
}tr[N<<2];

void Pushup(int rt){
    tr[rt].mx=max(tr[rt<<1].mx,tr[rt<<1|1].mx);
    tr[rt].mn=min(tr[rt<<1].mn,tr[rt<<1|1].mn);
}

void build(int rt,int l,int r){
    if(l==r){
        tr[rt].mn=tr[rt].mx=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(Lson);
    build(Rson);
    Pushup(rt);
}

int query(int rt,int l,int r,int L,int R,int c){
    if(L<=l&&r<=R){
        if(!c)return tr[rt].mn;
        else return tr[rt].mx;
    }
    int mid=(l+r)>>1;
    int mxval=-INF,mnval=INF;
    if(L<=mid){
        if(!c)mnval=min(mnval,query(Lson,L,R,c));   //注意这里最大和最小都是向左儿子递归 
        else mxval=max(mxval,query(Lson,L,R,c));
    }
    if(R>mid){
        if(!c)mnval=min(mnval,query(Rson,L,R,c));
        else mxval=max(mxval,query(Rson,L,R,c));
    }
    if(!c)return mnval;
    else return mxval;
}

int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        build(1,1,n);
        for(int i=1;i<=m;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            int mx=query(1,1,n,u,v,1);
            int mn=query(1,1,n,u,v,0);
            printf("%d\n",mx-mn);
        }
    }
    return 0;
} 

 

 

2018-09-23

POJ 3264 Balanced Lineup 【线段树】

标签:font   name   ++   include   eof   ons   val   net   ref   

原文地址:https://www.cnblogs.com/00isok/p/9692914.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!