样例过了,但是0分代码求助
查看原帖
样例过了,但是0分代码求助
1021000
wahe楼主2025/1/8 17:12

自己测试了很久,找不出问题
代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
int w[1000005], a[1000005], lzy[1000005];
int n, m;

bool irange(int nl, int nr, int l, int r) {
	return (nl >= l && nr <= r);
}

bool orange(int nl, int nr, int l, int r) {
	return (nl > r) || (nr < l);
}

void push_up(int u) {
	w[u] = w[u * 2] + w[u * 2 + 1];
} 

void make_tag(int u, int len, int k){
	lzy[u] += k;
	w[u] += k * len;	
}

void push_down(int u, int nl, int nr) {
	int m = (nl + nr) / 2;
	make_tag(u * 2, (m - nl + 1), lzy[u]);
	make_tag(u * 2 + 1, (nr - m), lzy[u]);	
	lzy[u] = 0;
}

void build(int u, int l, int r) {
	if(l == r) {
		w[u] = a[l];
		return;
	}
	int mid = (l + r) / 2;
	build(u * 2, l, mid);
	build(u * 2 + 1, mid + 1, r);
	push_up(u);
}

int sum(int u, int nl, int nr, int l, int r){
	if(irange(nl, nr, l, r)) {
		return w[u];
	}
	else if(!orange(nl, nr, l, r)) {
		push_down(u, nl, nr);
		int mid = (nl + nr) / 2;
		return sum(u * 2, nl, mid, l, r) + sum(u * 2 + 1, mid + 1, nr, l, r);
	}
	else return 0;
}

void plu(int u, int nl, int nr, int l, int r, int k) {
	if(irange(nl, nr, l, r)) {
		make_tag(u, (nr - nr + 1), k);	
		return ;
	}
	
	if(!orange(nl, nr, l, r)) {
		int mid = (nl + nr) / 2;
		push_down(u, nl, nr);
		plu(u * 2, nl, mid, l, r, k);
		plu(u * 2 + 1, mid + 1, nr, l, r, k);
		push_up(u);	
	}
}

signed main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) {
		cin >> a[i];
	}
	build(1, 1, n);
	for(int i = 1; i <= m; i ++) {
		int op;
		int x, y, k;
		cin >> op >> x >> y;
		if(op == 1) {
			cin >> k;
			plu(1, 1, n, x, y, k);	
		}
		else {
			cout << sum(1, 1, n, x, y) << endl;
		}
	}
	return 0;
} 
2025/1/8 17:12
加载中...