萌新不理解为什么4倍数组不够大
查看原帖
萌新不理解为什么4倍数组不够大
648953
1Stone楼主2022/9/29 19:56

明明开到4e5,但是为什么不够大呢

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lch (R << 1)
#define rch ((R << 1) | 1)
#define mid ((l + r) >> 1) 
ll N, M, dis, x, y, z;
struct Tree {
	ll val[100050], tree[400050], tag[400050];
	void Push_up(ll R){tree[R] = tree[lch] + tree[rch];}
	void Push_down(ll R, ll l, ll r) {
		tag[lch] += tag[R];
		tag[rch] += tag[R];
		tree[lch] += (mid - l + 1) * tag[R];
		tree[rch] += (r - mid) * tag[R];
		tag[R] = 0;
	}
	void Build(ll R, ll l, ll r) {
		tag[R] = 0;
		if(l == r) {tree[R] = val[l]; return;}
		Build(lch, l, mid);
		Build(rch, mid + 1, r);
		Push_up(R);
	}
	void Update(ll R, ll l, ll r, ll ql, ll qr, ll delta) {
		if(l >= ql && r <= qr) {
			tree[R] += (r - l + 1) * delta;
			tag[R] += delta;
			return;
		}
		Push_down(R, l, r);//如果不下放,有lazy_tag的节点会被旧的(未被更新的)子节点更新 
		if(ql <= mid) Update(lch, l, mid, ql, qr, delta);//ql,qr不要动 
		if(mid + 1 <= qr) Update(rch, mid + 1, r, ql, qr, delta);//
		Push_up(R);
	}
	ll Query(ll R, ll l, ll r, ll ql, ll qr) {
		Push_down(R, l, r);
		if(ql <= l && qr >= r)return tree[R];
		ll Sum = 0;
		if(ql <= mid) Sum += Query(lch, l, mid, ql, qr);//
		if(mid + 1 <= qr) Sum += Query(rch, mid + 1, r, ql, qr);//
		return Sum;
	}
}T;
int main()
{
	cin >> N >> M;
	for(int i = 1; i <= N; i++) cin >> T.val[i];
	T.Build(1, 1, N);
	while(M--) {
		cin >> dis >> x >> y;
		if(dis & 1) {
			cin >> z;
			T.Update(1, 1, N, x, y, z);
		} else {
			cout << T.Query(1, 1, N, x, y) << "\n";
		}
	}
	
	
	
	
	
	
	
	
	return 0;
}

2022/9/29 19:56
加载中...