模板线段树

Posted qq8260573

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板线段树相关的知识,希望对你有一定的参考价值。

区间和 为例。

ll ls(ll p) {return p<<1;}
ll rs(ll p) {return p<<1|1;}
void push_up(ll p) {
    ans[p]=ans[ls(p)]+ans[rs(p)];
}
void build(ll p,ll l,ll r) {
    tag[p]=0;
    if(l==r) {ans[p]=a[l]; return ;}
    ll Mid=(l+r)>>1;
    build(ls(p),l,Mid);
    build(rs(p),Mid+1,r);
    push_up(p);
}
void f(ll p,ll l,ll r,ll k) {
    tag[p]=tag[p]+k;
    ans[p]=ans[p]+k*(r-l+1);
}
void push_down(ll p,ll l,ll r) {
    ll Mid=(l+r)>>1;
    f(ls(p),l,Mid,tag[p]);
    f(rs(p),Mid+1,r,tag[p]);
    tag[p]=0;
}
void update(ll nl,ll nr,ll p,ll l,ll r,ll k) {
    if(nl<=l&&r<=nr) {
        tag[p]+=k;
        ans[p]+=k*(r-l+1);
        return ;
    }
    push_down(p,l,r);
    ll Mid=(l+r)>>1;
    if(nl<=Mid) update(nl,nr,ls(p),l,Mid,k);
    if(nr>Mid) update(nl,nr,rs(p),Mid+1,r,k);
    push_up(p);
}
ll query(ll ql,ll qr,ll p,ll l,ll r) {
    ll res=0;
    if(ql<=l&&r<=qr) return ans[p];
    ll Mid=(l+r)>>1;
    push_down(p,l,r);
    if(ql<=Mid) res+=query(ql,qr,ls(p),l,Mid);
    if(qr>Mid) res+=query(ql,qr,rs(p),Mid+1,r);
    return res;
}

 

以上是关于模板线段树的主要内容,如果未能解决你的问题,请参考以下文章

线段树模板整理

线段树模板总结

线段树模板

模板线段树-单点修改,区间查询

P3834 模板可持久化线段树 1(主席树)

模板 线段树(部分功能)