线段树模板求条
  • 板块学术版
  • 楼主_Chronostatis_
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/12/17 09:44
  • 上次更新2024/12/17 17:49:39
查看原帖
线段树模板求条
768951
_Chronostatis_楼主2024/12/17 09:44

rt.一个区间修改区间查询的板子,状态是wa,似乎不是数据范围的问题,题目 n 为 10510^5 级别,数据为 101810^{18} 级别。

#include <iostream>

using namespace std;

#define ll long long

const int MAXN = 4e5 + 10;

int t, n, m;
ll tr[MAXN], vis[MAXN];

int lc(int now) {
	return now * 2;
}

int rc(int now) {
	return now * 2 + 1;
}

void push_up(int now) {
	tr[now] = tr[lc(now)] + tr[rc(now)];
}

void push_down(int now, int ln, int rn) {
	ll e = vis[now];
	if (vis[now]) {
		vis[lc(now)] += e;
		vis[rc(now)] += e;
		tr[lc(now)] += e * ln;
		tr[rc(now)] += e * rn;
		vis[now] = 0;
	}
}

void build(int now, int l, int r) {
	if (l == r) {
		cin >> tr[now];
		return;
	}
	int mid = (l + r) >> 1;
	build(lc(now), l, mid);
	build(rc(now), mid + 1, r);
	push_up(now);
}

ll query(int now, int l, int r, int L, int R) {
	ll ans = 0;
	if (L <= l && R >= r) {
		return tr[now];
	}
	int mid = (l + r) >> 1;
	push_down(now, mid - l + 1, r - mid);
	if (L <= mid) {
		ans += query(lc(now), l, mid, L, R);
	}
	if (R > mid) {
		ans += query(rc(now), mid + 1, r, L, R);
	}
	return ans;
}

void update(int now, int l, int r, int L, int R, ll e) {
	if (L > r || R < l) {
		return;
	}
	if (L <= l && r <= R) {
		tr[now] += e * (r - l + 1);
		vis[now] = e;
		return;
	}
	int mid = (l + r) >> 1;
	push_down(now, mid - l + 1, r - mid);
	if (L <= mid) {
		update(lc(now), l, mid, L, R, e);
	}
	if (mid < R) {
		update(rc(now), mid + 1, r, L, R, e);
	}
	push_up(now);
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> n >> m;
	build(1, 1, n);
	for (int x, y, z; m--; ) {
		char c;
		cin >> c >> x >> y;
		if (c == 'C') {
			cin >> z;
			update(1, 1, n, x, y, z);
		} else {
			cout << query(1, 1, n, x, y) << '\n';
		}
	}
	return 0;
}
2024/12/17 09:44
加载中...