线段树学习笔记——模板代码更新

这里更新一份SegTree的板子

class Seg{
private:
    #define ls p<<1 
    #define rs p<<1|1

    struct point{
        ll sum;
        ll lz;
    }tr[N<<2];
    
    void pushdown(int p,int l,int r){
        if(tr[p].lz){
            int mid=(l+r)/2;
            tr[ls].sum += tr[p].lz*(mid-l+1);
            tr[rs].sum += tr[p].lz*(r-mid);
            tr[ls].lz += tr[p].lz;
            tr[rs].lz += tr[p].lz;
            tr[p].lz=0;
        }
        return;
    }
    void pushup(int p){
        tr[p].sum=tr[ls].sum+tr[rs].sum;
    }

    void build(int p,int l,int r){
        tr[p].lz=0;
        if(l==r){
            tr[p].sum=c[l];
            return;
        }
        int mid=(l+r)/2;
        build(ls,l,mid);
        build(rs,mid+1,r);
        pushup(p);
    }
    void update(int p,int l,int r,int L,int R,int val){
        if(L<=l && r<=R){
            tr[p].sum += val*(r-l+1);
            tr[p].lz += val;
            return;
        }
        pushdown(p,l,r);
        int mid=(l+r)/2;
        if(L<=mid) update(ls,l,mid,L,R,val);
        if(R>mid)  update(rs,mid+1,r,L,R,val);
        pushup(p);
    }
    ll ask(int p,int l,int r,int L,int R){
        if(L<=l && r<=R){
            return tr[p].sum;
        }
        pushdown(p,l,r);
        int mid=(l+r)/2;
        ll ret=0;
        if(L<=mid) ret+=ask(ls,l,mid,L,R);
        if(R>mid)  ret+=ask(rs,mid+1,r,L,R);
        return ret;
    }

    #undef ls 
    #undef rs
public:
	int sz;
    void init(int siz,int arr[]){
    	sz=siz;
        for(int i=1;i<=sz;i++){
            c[i]=arr[i];
        }
        build(1,1,sz);
    }
    
    ll query(int l,int r){
        return ask(1,1,sz,l,r);
    }
    void add(int l,int r,int val){
        update(1,1,sz,l,r,val);
    }
}seg;
posted @ 2026-06-30 20:06  词印  阅读(8)  评论(0)    收藏  举报