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

HDU-1754 I Hate It

时间:2017-04-29 01:15:13      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:clu   oid   lazy   UI   清除   区间   turn   upd   std   

线段树的区间更新,也是模板题了,,,好像还是比较简单的那种,,,,

lazy[maxn]标记,如果更新的节点被要更新的区间包括的话就加一个lazy标记,停止更新,等到下次再更新到这个节点的时候,就把这个节点pushdown(放下),//更新左子树和右子树并把lazy标记清除;

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

const int maxn=2e5+5;
int grd[maxn*4];

void build(int l,int r,int rt){
    if(l==r) {
        scanf("%d",&grd[rt]);
        return ;
    }
    int m=(l+r)>>1;
    build(l,m,rt<<1);
    build(m+1,r,rt<<1|1);
    grd[rt]=max(grd[rt<<1],grd[rt<<1|1]);
}

void update(int l,int r,int rt,int a,int m){
    if(l==r&&r==a){
        grd[rt]=m;
        return ;
    }
    int mid=(l+r)/2;
    if(a<=mid) update(l,mid,rt<<1,a,m);
    else update(mid+1,r,rt<<1|1,a,m);
    grd[rt]=max(grd[rt<<1],grd[rt<<1|1]);
}

int query(int L,int R,int l,int r,int rt){
    if(L<=l&&r<=R) return grd[rt];
    int maxx=0;
    int mid=(l+r)/2;
    if(L<=mid) maxx=max(maxx,query(L,R,l,mid,rt<<1));
    if(R>mid) maxx=max(maxx,query(L,R,mid+1,r,rt<<1|1));
    return maxx;
}

int main(){
    int N,M;
    while(scanf("%d%d",&N,&M)!=EOF){
        build(1,N,1);
        char s[5];
        int a,m;
        for(int i=0;i<M;i++){
            scanf("%s%d%d",s,&a,&m);
            //cout<<s[0];
            if(s[0]==‘Q‘) printf("%d\n",query(a,m,1,N,1));
            if(s[0]==‘U‘) update(1,N,1,a,m);
        }
    }
    return 0;
}

HDU-1754 I Hate It

标签:clu   oid   lazy   UI   清除   区间   turn   upd   std   

原文地址:http://www.cnblogs.com/lintanxi/p/6783811.html

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