zoukankan      html  css  js  c++  java
  • hiho1080

    题目链接

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

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

    每走到一个区间就把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
    ",segtree[1].sum);
        }
        return 0;
    }
  • 相关阅读:
    胡小兔的良心莫队教程:莫队、带修改莫队、树上莫队
    51nod 1290 Counting Diff Pairs | 莫队 树状数组
    Git的简单使用
    使用canvas制作五子棋游戏
    axios的Get和Post方法封装及Node后端接收数据
    mongodb初始化并使用node.js实现mongodb操作封装
    nodeJs实现微信小程序的图片上传
    CSS中text-shadow的几个好看的文字demo及其代码
    博客园自定义样式
    input输入框添加内部图标
  • 原文地址:https://www.cnblogs.com/redips-l/p/6844752.html
Copyright © 2011-2022 走看看