线段树板子

再来!

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

结构体要规定在全局变量

否则空间不允许

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;
posted @ 2025-03-04 21:44  Marinaco  阅读(15)  评论(0)    收藏  举报
//雪花飘落效果