• 线段树模板


    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll N=1000010;
    ll n,m;
    ll a[N];
    
    struct Node{
        ll it;
        ll l;
        ll r;
        ll data;
    }tree[N];
    
    void build(ll rt,ll l,ll r){
        tree[rt].l=l;
        tree[rt].r=r;
        tree[rt].it=0;
        if(l==r){
            tree[rt].data=a[l];
            return ;
        }
        ll mid = (l+r)>>1;
        build(rt*2,l,mid);
        build(rt*2+1,mid+1,r);
        tree[rt].data=tree[rt*2].data+tree[rt*2+1].data;
        return ;
    }
    
    void push_down(ll rt){
        if(tree[rt].it!=0){
            tree[rt*2].it+=tree[rt].it;
            tree[rt*2+1].it+=tree[rt].it;
            ll mid = (tree[rt].l+tree[rt].r)>>1;
            tree[rt*2].data+=tree[rt].it*(mid-tree[rt*2].l+1);
            tree[rt*2+1].data+=tree[rt].it*(tree[rt*2+1].r-mid);
            tree[rt].it=0;
        }
        return ;
    }
    
    void up_data(ll rt,ll l,ll r,ll k){
        if(tree[rt].l>=l&&tree[rt].r<=r){
            tree[rt].data+=k*(tree[rt].r-tree[rt].l+1);
            tree[rt].it+=k;
            return ;
        }
        push_down(rt);
        if(tree[rt*2].r>=l){
            up_data(rt*2,l,r,k);
        }
        if(tree[rt*2+1].l<=r){
            up_data(rt*2+1,l,r,k);
        }
        tree[rt].data=tree[rt*2].data+tree[rt*2+1].data;
        return ;
    }
    
    ll search(ll rt,ll l,ll r){
        if(tree[rt].l>=l&&tree[rt].r<=r){
            return tree[rt].data;
        }
        push_down(rt);
        ll num=0;
        if(tree[rt*2].r>=l){
            num+=search(rt*2,l,r);
        }
        if(tree[rt*2+1].l<=r){
            num+=search(rt*2+1,l,r);
        }
        return num;
    }
    
    int main(){
        scanf("%lld%lld",&n,&m);
        for(ll i=1;i<=n;i++){
            scanf("%lld",&a[i]);
        }
        build(1,1,n);
        for(ll i=1;i<=m;i++){
            ll go;
            scanf("%lld",&go);
            if(go==1){
                ll a,b,c;
                scanf("%lld%lld%lld",&a,&b,&c);
                up_data(1,a,b,c);
            }
            if(go==2){
                ll a,b;
                scanf("%lld%lld",&a,&b);
                printf("%lld
    ",search(1,a,b));
            }
        }
        return 0;
    }

    https://www.cnblogs.com/jason2003/p/9676729.html

  • 相关阅读:
    vscode调试pomelo和pomelo使用vscode调试
    linux修改单个进程的系统时间
    python之路目录
    python之前端
    python之ORM操作
    python之redis和memcache操作
    python之消息队列
    python之协程与IO操作
    python之进程与线程
    python之网络编程
  • 原文地址:https://www.cnblogs.com/LightyaChoo/p/13198924.html
Copyright © 2020-2023  润新知