关于线段树
  • 板块灌水区
  • 楼主CP_2309
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/11/6 11:17
  • 上次更新2024/11/6 16:40:47
查看原帖
关于线段树
1250354
CP_2309楼主2024/11/6 11:17

模板1代码:

#include<bits/stdc++.h> 
using namespace std;
const int N = 1e5 + 10;
int n, a[N * 4];
struct node {
	int l, r, val, lz;
}tr[N * 4];
void build(int id, int l, int r) {
	tr[id].l = l, tr[id].r = r;
	if (l == r) {
		tr[id].val = a[l];
		return ;
	}
	int mid = (l + r) >> 1;
	build(id * 2, l, mid);
	build(id * 2 + 1, mid + 1, r);
	tr[id].val = tr[id * 2].val + tr[id * 2 + 1].val;
}
void push_down(int id) {
	tr[id * 2].lz += tr[id].lz;
	tr[id * 2 + 1].lz += tr[id].lz;
	tr[id * 2].val += (tr[id * 2].r - tr[id * 2].l + 1) * tr[id].lz;
	tr[id * 2 + 1].val += (tr[id * 2 + 1].r - tr[id * 2 + 1].l + 1) * tr[id].lz;
	tr[id].lz = 0;
}
void upd(int id, int l, int r, int k) {
	if (l <= tr[id].l && tr[id].r <= r) {
		tr[id].lz += k;
		tr[id].val += (tr[id].r - tr[id].l + 1) * k;
		return ;
	}
	push_down(id);
	if (tr[id * 2].r >= l) upd(id * 2, l, r, k);
	if (tr[id * 2 + 1].l <= r) upd(id * 2 + 1, l, r, k);
	tr[id].val = tr[id * 2].val + tr[id * 2 + 1].val;
}
int sum(int id, int l, int r) {
	if (l <= tr[id].l && tr[id].r <= r) {
		return tr[id].val;
	}
	push_down(id);
	int ans = 0;
	if (tr[id * 2].r >= l) ans += sum(id * 2, l, r);
	if (tr[id * 2 + 1].l <= r) ans += sum(id * 2 + 1, l, r);
	return ans;
}
int main() {
	int m;
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
	}
	build(1, 1, n);
	while (m--) {
		int opt, l, r;
		cin >> opt >> l >> r;
		if (opt == 1) {
			int k;
			cin >> k;
			upd(1, l, r, k); 
		}
		else {
			cout << sum(1, l, r) << '\n';
		}
	}
	return 0;
}

70ptsWA求调

2024/11/6 11:17
加载中...