线段树板子
再来!
发现参数传数组时,时间复杂度暴涨
结构体要规定在全局变量
否则空间不允许
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;

浙公网安备 33010602011771号