求助,为什么update里面必须加上pushdown,不加就会wa
查看原帖
求助,为什么update里面必须加上pushdown,不加就会wa
35667
会唱歌的石榴楼主2023/11/23 12:35
#include<bits/stdc++.h>
using namespace std;
const int N = 100000 + 10;
struct tree{
	int l,r;
	long long add,sum;
}tree[4 * N];
int n,m;
long long a[N];

void pushdown(int u){
	auto &root = tree[u],&b = tree[u << 1],&c = tree[u << 1 | 1];
	if (root.add){
		b.add += root.add;
		b.sum += (long long)(b.r - b.l + 1) * root.add;
		c.add += root.add;
		c.sum += (long long)(c.r - c.l + 1) * root.add;
		root.add = 0;
	}
}

void build(int u,int l,int r){  // build a segment tree
	tree[u].l = l;
	tree[u].r = r;
	if (l == r) tree[u].sum = a[l];
	else{
		int mid = l + r >> 1;
		build(u << 1,l,mid);
		build(u << 1 | 1,mid + 1,r);
		tree[u].sum = tree[u << 1].sum + tree[u << 1 | 1].sum;
	}
}

void update(int u,int x,int y,long long d){  //从x到y加上d 
	int l = tree[u].l,r = tree[u].r,mid = l + r >> 1;
	if (x <= l && r <= y){
		tree[u].sum += (long long)(r - l + 1) * d;
		tree[u].add += d; 
	}
	else{
		pushdown(u);
		if (x <= mid) update(u << 1,x,y,d);
		if (y > mid) update(u << 1 | 1,x,y,d);
		tree[u].sum = tree[u << 1].sum + tree[u << 1 | 1].sum;
	}
}

long long query(int u,int x,int y){
	int l = tree[u].l,r = tree[u].r,mid = l + r >> 1;
	if (x <= l && y >= r) return tree[u].sum;
	else{
		pushdown(u);
		long long ans = 0;
		if (x <= mid) ans += query(u << 1,x,y);
		if (y > mid) ans += query(u << 1 | 1,x,y);
		return ans; 
	}
}

int main(){
	scanf("%d%d",&n,&m);
	for (int i = 1; i <= n; ++i)
		scanf("%lld",&a[i]);
	build(1,1,n);
	while (m--){
		int cnt;
		scanf("%d",&cnt);
		if (cnt == 1){
			int x,y,d;
			scanf("%d%d%lld",&x,&y,&d);
			update(1,x,y,d);
		}else{
			int x,y;
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(1,x,y));
		}
	}
}
2023/11/23 12:35
加载中...