zoukankan      html  css  js  c++  java
  • 线段树模板

    #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

  • 相关阅读:
    [Java123] JDBC and Multi-Threading 多线程编程学习笔记
    3:2D装换 [ 重点 ]
    2:属性选择器 + 结构伪类选择器 + 伪元素
    1:新增 H5 常用属性
    day2
    代码实操第一天
    1 滑动门
    css高级技巧
    11:网页布局总结
    10:定位
  • 原文地址:https://www.cnblogs.com/LightyaChoo/p/13198924.html
Copyright © 2011-2022 走看看