模板线段树
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; }
以上是关于模板线段树的主要内容,如果未能解决你的问题,请参考以下文章