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

hiho1080 - 数据结构 线段树(入门题,两个lazy tag)

时间:2017-05-12 13:29:13      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:problem   push   void   mod   value   hihocoder   return   区间   设置   

题目链接

维护区间和,两个操作:一个是将某个区间设置成一个值,一个是将某个区间增加一个固定值

/**************************************************************/

每走到一个区间就把lazy tag下放。下放的时候注意顺序!

#include <cstdio>
#include <cstring>
const int N = 100100;
struct NODE{
     int l,r;
     int sum;
     int setTo,add;
     NODE(){setTo=add=0;}
     int length(){return (r-l+1);}
};
int data[N];
NODE segtree[N*3];

void build(int id,int l,int r){
     segtree[id].l = l;
     segtree[id].r = r;
     if(l==r){
        segtree[id].sum = data[l];
        return ;
     }
     int mid = (l+r)>>1;
     build(id*2+0,l,mid);
     build(id*2+1,mid+1,r);
     segtree[id].sum = segtree[id*2+0].sum+segtree[id*2+1].sum;
}

void modify(int id,int spos,int epos,int value,int type){
     if(segtree[id].l==spos&&segtree[id].r==epos){
        if(type){
            segtree[id].setTo = value;
            segtree[id].add = 0;
            segtree[id].sum = segtree[id].length()*value;
        }
        else{
            segtree[id].add += value;
            segtree[id].sum += segtree[id].length()*value;
        }
        return ;
     }

     //push down
     if(segtree[id].setTo){
        segtree[id*2+0].setTo=segtree[id*2+1].setTo=segtree[id].setTo;
        segtree[id*2+0].add=segtree[id*2+1].add=0;
        segtree[id*2+0].sum = segtree[id*2+0].length()*segtree[id*2+0].setTo;
        segtree[id*2+1].sum = segtree[id*2+1].length()*segtree[id*2+1].setTo;
        segtree[id].setTo = 0;
     }
     if(segtree[id].add){
        segtree[id*2+0].add += segtree[id].add;
        segtree[id*2+1].add += segtree[id].add;
        segtree[id*2+0].sum += segtree[id*2+0].length()*segtree[id].add;
        segtree[id*2+1].sum += segtree[id*2+1].length()*segtree[id].add;
        segtree[id].add = 0;
     }

     int mid = (segtree[id].l+segtree[id].r)>>1;
     if(epos<=mid) modify(id*2,spos,epos,value,type);
     else if(spos>mid) modify(id*2+1,spos,epos,value,type);
     else{
        modify(id*2+0,spos,mid,value,type);
        modify(id*2+1,mid+1,epos,value,type);
     }

     segtree[id].sum = segtree[id*2+0].sum+segtree[id*2+1].sum;
}
int main(){
    int n,t;
    scanf("%d%d",&n,&t); n++;
    for(int i=1;i<=n;i++) scanf("%d",data+i);
    build(1,1,n);
    while(t--){
        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        modify(1,b+1,c+1,d,a);
        printf("%d\n",segtree[1].sum);
    }
    return 0;
}

 

hiho1080 - 数据结构 线段树(入门题,两个lazy tag)

标签:problem   push   void   mod   value   hihocoder   return   区间   设置   

原文地址:http://www.cnblogs.com/redips-l/p/6844752.html

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