线段树求调
  • 板块学术版
  • 楼主jimmyfj
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/11/25 23:33
  • 上次更新2023/10/27 01:29:10
查看原帖
线段树求调
462047
jimmyfj楼主2022/11/25 23:33

放在洛谷 IDE 上面运行提示超出内存限制,不知道哪里错了。

萌新初学线段树

#include <bits/stdc++.h>

using namespace std;

int s[100005], tree[400005], tag[400005];
int n, m;
int x, y, z;

void pushup(int cur) {
	tree[cur] = tree[cur << 1] + tree[cur << 1 | 1];
	return ;
}

void addtag(int cur, int left, int right, int var) {
	tag[cur] += var;
	tree[cur] += (right - left + 1) * var;
}

void pushdown(int cur, int left, int right) {
	if (! tag[cur]) return ;
	int mid = (left + right) >> 1;
	addtag(cur << 1, left, mid, tag[cur]);
	addtag(cur << 1 | 1, mid + 1, right, tag[cur]);
	tag[cur] = 0;
}

void build(int cur, int left, int right) {
	if (left == right) {
		tree[cur] = s[left];
		return ; 
	}
	int mid = (left + right) >> 1;
	build(cur << 1, left, mid);
	build(cur << 1 | 1, mid + 1, right);
	pushup(cur);
	return ;
}

int query(int cur, int left, int right, int l, int r) {
	if (left > r || right < l) return 0;
	if (left >= l && right <= r) {
		return tree[cur];
	}
	pushdown(cur, left, right);
	int mid = (left + right) >> 1;
	return query(cur << 1, left, mid, l, r) + query(cur << 1 | 1, mid + 1, right, l, r);
}

void update(int cur, int left, int right, int l, int r, int var) {
	if (left > r || right < l) return ;
	if (left >= l && right <= r) {
		addtag(cur, left, right, var);
		return ;
	}
	pushdown(cur, left, right);
	int mid = (left + right) >> 1;
	update(cur << 1, left, mid, l, r, var);
	update(cur << 1 | 1, mid + 1, right, l, r, var);
	pushup(cur);
}

signed main () {
	cin >> n >> m; 
	for (int i = 1; i <= n; i ++) cin >> s[i];
    build(1, 1, n);
	while (m --) {
		int q;
		cin >> q;
		if (q == 1) {
			cin >> x >> y >> z;
			update(1, 1, n, x, y, z);
		} else {
			cin >> x >> y;
			cout << query(1, 1, n, x, y) << "\n";
		}
	}
	return 0;
} 
2022/11/25 23:33
加载中...