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

POJ-3264-Balanced Lineup-单点更新

时间:2017-06-26 23:53:42      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:敌兵布阵   while   href   线段   define   iostream   最大值   namespace   content   

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

id=3264

这是一个单点更新的模板题,就不详解了,HDU敌兵布阵那题我有详解;链接:http://blog.csdn.net/wlxsq/article/details/46897219

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#define LL long long
using namespace std;
/*
    这是一个线段树单点更新的模板题。只是每一个节点存两个数据。最大值和最小值;
*/
const int inf=0xffffff0;
int MinV,MaxV;
int q,n,a,b;
struct node
{
    int l,r,MinV,MaxV;
}node[200010];
void PushUp(int rt,int v)       //  更新父节点;
{
    node[rt].MinV=min(node[rt].MinV,v);
    node[rt].MaxV=max(node[rt].MaxV,v);
}
void build(int l,int r,int rt)
{
    int mid=(l+r)>>1;
    node[rt].l=l;
    node[rt].r=r;
    node[rt].MinV=inf;
    node[rt].MaxV=-inf;
    if(l==r) return;
    else{
        build(l,mid,rt<<1);
        build(mid+1,r,rt<<1|1);
    }
}
void Insert(int rt,int p,int v)
{
    int l=node[rt].l;
    int r=node[rt].r;
    if(l==r&&p==l){
        node[rt].MinV=v;
        node[rt].MaxV=v;
        return;
    }
    //node[rt].MinV=min(v,node[rt].MinV);
    //node[rt].MaxV=max(v,node[rt].MaxV);
    int mid=(l+r)>>1;
    if(p<=mid) Insert(rt<<1,p,v);
    else Insert(rt<<1|1,p,v);
    PushUp(rt,v);
}
void query(int l,int r,int rt)
{
    if(node[rt].MaxV<=MaxV&&node[rt].MinV>=MinV) return;        //  往下搜没有什么意义了,能够直接退出;
    if(l==node[rt].l&&r==node[rt].r){
        MinV=min(node[rt].MinV,MinV);
        MaxV=max(node[rt].MaxV,MaxV);
        return;
    }
    int mid=(node[rt].l+node[rt].r)>>1;
    if(r<=mid) query(l,r,rt<<1);
    else if(l>mid) query(l,r,rt<<1|1);
    else{
        query(l,mid,rt<<1);
        query(mid+1,r,rt<<1|1);
    }
}
int main()
{
    while(~scanf("%d%d",&n,&q)){
        build(1,n,1);
        for(int i=1;i<=n;i++){
            scanf("%d",&a);
            Insert(1,i,a);
        }
        for(int i=1;i<=q;i++){
            scanf("%d%d",&a,&b);
            MinV=inf;
            MaxV=-inf;
            query(a,b,1);
            printf("%d\n",MaxV-MinV);
        }
    }
    return 0;
}


 

POJ-3264-Balanced Lineup-单点更新

标签:敌兵布阵   while   href   线段   define   iostream   最大值   namespace   content   

原文地址:http://www.cnblogs.com/brucemengbm/p/7082677.html

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