POJ 3468 A Simple Problem with Integers
  • 板块学术版
  • 楼主kimi0705
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/1/14 17:37
  • 上次更新2023/10/24 04:16:17
查看原帖
POJ 3468 A Simple Problem with Integers
637788
kimi0705楼主2023/1/14 17:37
#include <iostream>
using namespace std;
const long long N = 1e5 + 10;
long long arr[N], n, m;
struct Tree {
	long long l, r, sum, lan;
} tree[N * 4];
void built(long long i, long long l, long long r) {
	tree[i].l = l;
	tree[i].r = r;
	tree[i].lan = 0;
	if (l == r) {
		tree[i].sum = arr[l];
		return;
	}
	long long mid = (l + r) >> 1;
	built(i * 2, l, mid);
	built(i * 2 + 1, mid + 1, r);
	tree[i].sum = tree[i * 2].sum + tree[i * 2 + 1].sum;
}
void push_down(long long i) {
	if (tree[i].lan) {
		tree[i * 2].sum += (tree[i * 2].r - tree[i * 2].l + 1) * tree[i].lan;
		tree[i * 2 + 1].sum += (tree[i * 2 + 1].r - tree[i * 2 + 1].l + 1) *tree[i].lan;
		tree[i * 2].lan += tree[i].lan;
		tree[i * 2 + 1].lan += tree[i].lan;
		tree[i].lan = 0;
	}
}
void add(long long i, long long j, long long k, long long l) {
	if (j <= tree[i].l && tree[i].r <= k) {
		tree[i].sum += (tree[i].r - tree[i].l + 1) * l;
		tree[i].lan += l;
		return;
	}
	long long mid = (tree[i].l + tree[i].r) >> 1;
	push_down(i);
	if (j <= mid) add(i * 2, j, k, l);
	if (k > mid) add(i * 2 + 1, j, k, l);
	tree[i].sum = tree[i * 2].sum + tree[i * 2 + 1].sum;
}
long long get_sum(long long i, long long l, long long r) {
	long long sum = 0;
	if (tree[i].l >= l && r >= tree[i].r) {
		return tree[i].sum;
	}
	push_down(i);
	if (tree[i * 2].r >= l) {
		sum += get_sum(i * 2, l, r);
	}
	if (tree[i * 2 + 1].l <= r) {
		sum += get_sum(i * 2 + 1, l, r);
	}
	return sum;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for (long long i = 1; i <= n; i++) cin >> arr[i];
	built(1, 1, n);
	for (long long i = 1; i <= m; i++) {
		char flag;
		long long a, b, c;
		cin >> flag >> a >> b;
		if (flag == 'C') {
			cin >> c;
			add(1, a, b, c);
		} else {
			cout << get_sum(1, a, b) << endl;
		}
	}
	return 0;
}
2023/1/14 17:37
加载中...