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

  • 相关阅读:
    MySQL基础(二)
    MySQL练习题
    前端基础之css
    前端基础之初识HTML
    Ubuntu14.04 + Text-Detection-with-FRCN(CPU)
    简单HOG+SVM mnist手写数字分类
    汽车检测SIFT+BOW+SVM
    4. Neural Network
    2. Linear Model
    OpenCV2计算机编程手册(二)基于类的图像处理
  • 原文地址:https://www.cnblogs.com/LightyaChoo/p/13198924.html
Copyright © 2011-2022 走看看