码迷,mamicode.com
首页 > 其他好文 > 详细

【模板】线段树

时间:2019-02-24 15:05:11      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:pre   font   +=   class   date   update   query   res   区间   

区间和 为例。

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;
}

 

【模板】线段树

标签:pre   font   +=   class   date   update   query   res   区间   

原文地址:https://www.cnblogs.com/qq8260573/p/10426175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!