求助,有1个re了
  • 板块P2357 守墓人
  • 楼主jofish
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/8 16:34
  • 上次更新2024/7/8 17:33:04
查看原帖
求助,有1个re了
1057425
jofish楼主2024/7/8 16:34
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const int N = 2*1e5+10;

#define lp p<<1
#define rp p<<1|1

int n, f;

ll W[N];

struct Node {
	int l, r; 
	ll sum, add;
	ll len() {return r-l+1;}
	bool in(int _l, int _r) {return (_l <= l && r <= _r);}
}ts[N<<2];

void pushup(int p) {
	ts[p].sum  = ts[lp].sum + ts[rp].sum; 
}

void pushdown(int p) {
	if (ts[p].add) {
		ts[lp].sum += ts[lp].len() * ts[p].add;
		ts[rp].sum += ts[rp].len() * ts[p].add;
		ts[lp].add += ts[p].add;
		ts[rp].add += ts[p].add;
		ts[p].add = 0;
	}
}

void build(int p, int l, int r) {
	ts[p] = {l, r,W[l]};
	if (l == r) return;
	int mid = l + r >> 1;
	build(lp, l, mid);
	build(rp, mid+1, r);
	pushup(p);
}

void update(int p, int l, int r, ll k) {
	pushdown(p);
	if (l <= ts[p].l && ts[p].r <= r) {
		ts[p].sum += ts[p].len() * k;
		ts[p].add += k;
		return;
	}
	int mid = ts[p].l + ts[p].r >> 1;
	if (l <= mid) update(lp, l, r, k);
	if (r > mid) update(rp, l, r, k);
	pushup(p);
}


void pointfix(int p, int x, ll k) {
	if (ts[p].l == x && ts[p].r == x) {
		ts[p].sum += k;
		return;
	}
	int mid = ts[p].l + ts[p].r >> 1;
	(x <= mid) ? pointfix(lp, x, k) : pointfix(rp, x ,k);
	pushup(p);
}

ll query(int p, int l, int r) {
	pushdown(p);
	if (l <= ts[p].l && ts[p].r <= r) return ts[p].sum;
	ll sum = 0;
	int mid = ts[p].l + ts[p].r >> 1;
	pushup(p);
	if (l <= mid) sum += query(lp, l, r);
	if (r > mid) sum += query(rp, l, r);
	return sum;
}


void pt(int p) {
	if (ts[p].l != ts[p].r) pt(lp);
	cout<<ts[p].sum<<" ";
	if (ts[p].l != ts[p].r) pt(rp);
}
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	
	cin>>n>>f;
	
	for (int i=1; i<=n; i++) cin>>W[i];
	build(1, 1, n);
	
	while(f--) {
		int op; cin>>op;
		if (op == 1) {
			int l, r; ll k;
			cin>>l>>r>>k;
			update(1, l,r,k);
		}
		else if (op == 2) {
			ll k; cin>>k;
			pointfix(1,1,k);
		}
		else if (op == 3) {
			ll k; cin>>k;
			pointfix(1,1,-k);
		}
		else if (op == 4) {
			int l, r; cin>>l>>r;
			cout<<query(1,l, r)<<"\n";
		}
		else {
			cout<<query(1,1,1)<<"\n";
		}
		
	}
	
	
}
2024/7/8 16:34
加载中...