与月亮独白,在硫磺之日下,众神将在此夜起舞|

Marinaco

园龄:2个月粉丝:3关注:4

线段树板子

再来!

发现参数传数组时,时间复杂度暴涨

结构体要规定在全局变量

否则空间不允许

query要pushdown

先pushdown在pushup

const int maxn=1e5+5;
int arr[maxn];
struct SGT{
struct node{
int l,r,sum;
int lazy;
}tr[4*maxn];
void build(int p,int l,int r){
tr[p]={l,r,arr[l],0};
if(l==r)return;
int m=l+r>>1;
build(2*p,l,m);build(2*p+1,m+1,r);
tr[p].sum=tr[2*p].sum+tr[2*p+1].sum;
}
void add(int p,int x,int plus){
if(tr[p].l==x&&tr[p].r==x){
tr[p].sum+=plus;return;
}
int m=tr[p].l+tr[p].r>>1;
if(x<=m)add(2*p,x,plus);else add(2*p+1,x,plus);
tr[p].sum=tr[2*p].sum+tr[2*p+1].sum;
}
void pushdown(int p){
if(tr[p].lazy!=0){
int debt=tr[p].lazy;
tr[2*p].sum+=(tr[2*p].r-tr[2*p].l+1)*debt;
tr[2*p+1].sum+=(tr[2*p+1].r-tr[2*p+1].l+1)*debt;
tr[2*p].lazy+=debt;tr[2*p+1].lazy+=debt;
tr[p].lazy=0;
}
}
int query(int p,int l,int r){
if(l<=tr[p].l&&tr[p].r<=r){
return tr[p].sum;
}
pushdown(p);
int m=tr[p].l+tr[p].r>>1;
int sum=0;
if(l<=m)sum+=query(2*p,l,r);
if(r>m)sum+=query(2*p+1,l,r);
return sum;
}
void pushup(int p){
tr[p].sum=tr[2*p].sum+tr[2*p+1].sum;
}
void add(int p,int l,int r,int plus){
if(l<=tr[p].l&&tr[p].r<=r){
tr[p].sum+=(tr[p].r-tr[p].l+1)*plus;
tr[p].lazy+=plus;return;
}
int m= tr[p].l+tr[p].r>>1;
pushdown(p);
if(l<=m)add(2*p,l,r,plus);
if(r>m)add(2*p+1,l,r,plus);
pushup(p);
}
};
SGT segment_tree;

本文作者:Ben`s code

本文链接:https://www.cnblogs.com/benscode/p/18751556

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Marinaco  阅读(5)  评论(0编辑  收藏  举报
//雪花飘落效果
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起