线段树板子(区间求和)

1.定义:

const int maxn=400040;
int n,a[maxn],lazy[maxn],ans[maxn];

2.更新:

inline void push_up(int root){
    ans[root]=ans[root<<1]+ans[root<<1|1];
}

3.下传懒标记:

inline void push_down(int root,int ln,int rn){
    if(lazy[root]){
        lazy[root<<1]+=lazy[root];
        lazy[root<<1|1]+=lazy[root];
        ans[root<<1]+=lazy[root]*ln;
        ans[root<<1|1]+=lazy[root]*rn;
        lazy[root]=0;
    }
}

4.pos位置增加C 
inline void Add(int pos,int C,int l,int r,int root){
    if(l==r){
        ans[root]+=C;
        return;
    }
    int mid=(l+r)>>1;
    if(pos<=mid)
        Add(pos,C,l,mid,root<<1);
    else
        Add(pos,C,mid+1,r,root<<1|1);
    push_up(root);
}

5.L到R区间增加C 
inline void Update(int L,int R,int C,int l,int r,int root){
    if(L<=l&&R>=r){
        ans[root]+=C*(r-l+1);
        lazy[root]+=C;
        return;
    }
    int mid=(l+r)>>1;
    push_down(root,mid-l+1,r-mid);
    if(L<=mid) Update(L,R,C,l,mid,root<<1);
    if(R>mid) Update(L,R,C,mid+1,r,root<<1|1);
    push_up(root);
}

6.建树

inline void build(int l,int r,int root){
    if(l==r){
        ans[root]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,root<<1);
    build(mid+1,r,root<<1|1);
    push_up(root);
}

7.查询L到R和
inline ll Query(int L,int R,int l,int r,int root){
    if(L<=l&&R>=r)
        return ans[root];
    int mid=(l+r)>>1;
    push_down(root,mid-l+1,r-mid);
    ll ANS=0;
    if(L<=mid) ANS+=Query(L,R,l,mid,root<<1);
    if(R>mid) ANS+=Query(L,R,mid+1,r,root<<1|1);
    return ANS;
}

扫描二维码关注公众号,回复: 3457450 查看本文章

猜你喜欢

转载自blog.csdn.net/g21wcr/article/details/82290735
今日推荐