社区讨论

0 PTS 求调

P3372【模板】线段树 1参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mknxjgda
此快照首次捕获于
2026/01/21 19:18
2 个月前
此快照最后确认于
2026/01/24 19:20
上个月
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define mid ((l + r) >> 1)
#define ls(x) (x << 1)
#define rs(x) ((x << 1) | 1)

const int N = 1e6 + 5;

int n, m;
int a[N], ans[N * 4], tag[N * 4];

void push_up(int p) { return ans[p] = ans[ls(p)] + ans[rs(p)], void(); }

void build(int p, int l, int r) {
	tag[p] = 0;
	if (l == r) return ans[p] = a[l], void();
	build(ls(p), l, mid);
	build(rs(p), mid + 1, r);
	push_up(p);
}

void push_down(int p, int l, int r) {
	tag[ls(p)] += tag[p], tag[rs(p)] += tag[p];
	ans[ls(p)] += tag[p] * (mid - l + 1);
	ans[rs(p)] += tag[p] * (r - mid);
	tag[p] = 0;
}

void insert(int nl, int nr, int l, int r, int p, int k) {
	if (nl <= l && r <= nr) 
		return ans[p] += k * (r - l + 1), tag[p] += k, void();
	push_down(p, l, r);
	if (nl <= mid) insert(nl, nr, l, mid, ls(p), k);
	if (nr > mid) insert(nl, nr, mid + 1, r, rs(p), k);
	push_up(p);
}

int query(int nl ,int nr, int l, int r, int p) {
	int cnt = 0;
	if (nl <= l && r <= nr) 
		return ans[p];
	push_down(p, l, r);
	if (nl <= mid) cnt += query(nl, nr, l, mid, ls(p));
	if (nr > mid) cnt += query(nl, nr, mid + 1, r, rs(p));
	return cnt;
}

signed main() {
	scanf("%lld %lld", &n, &m);
	for (int i = 1; i <= n; i ++) scanf("%lld", &a[i]);
	
	build(1, 1, n);
	
	while (m --) {
		int opt, x, y, k; scanf("%d", &opt);
		if (opt == 1) {
			scanf("%d %d %lld", &x, &y, &k);
			insert(x, y, 1, n, 1, k);
		} else if (opt == 2) {
			scanf("%d %d", &x, &y);
			printf("%lld\n", query(x, y, 1, n, 1));
		}
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...