求助线段树代码
查看原帖
求助线段树代码
503822
Essinsop楼主2021/5/9 06:25

神奇地输出了17

感觉是 ans 数组在修改时出错了...或者思路有点问题

#include <bits/stdc++.h>
using namespace std;
int a[100005], c[100005], ans[1000005], n, m, tag[1000005];
int ls(int x) {
	return x << 1;
}
int rs(int x) {
	return x << 1|1;
}
void push_up(int x) {
	ans[x] += ans[ls(x)] + ans[rs(x)];
}
void build(int p, int l, int r) {
	int mid = (l + r) >> 1;
	if(l == r) {
		ans[p] = c[l];
		return;
	}
	build(ls(p), l, mid);
	build(rs(p), mid + 1, r);
	push_up(p);
}
void f(int p, int l, int r, int k) {
	ans[p] += (r - l + 1) * k;
	tag[p] += k;
}
void push_down(int p, int l, int r) {
	int mid = (l + r) >> 1;
	f(ls(p), l, mid, tag[p]);
	f(rs(p), mid + 1, r, tag[p]);
	tag[p] = 0;
}
void update(int p, int l, int r, int nl, int nr, int k) {
	if(nl <= l && r <= nr) {
		ans[p] += k * (r - l + 1);
		tag[p] += k;
		return;
	}
	int mid = (l + r) >> 1;
	push_down(p, l, r);
	if(nl <= mid) update(ls(p), l, mid, nl, nr, k);
	if(nr > mid) update(rs(p), mid + 1, r, nl, nr, k);
	push_up(p);
}
int query(int p, int l, int r, int nl, int nr) {
	int res = 0;
	if(nl <= l && r <= nr) {
		return ans[p];
	}
	int mid = (l + r) >> 1;
	push_down(p, l, r);
	if(nl <= mid) res += query(ls(p), l, mid, nl, nr);
	if(nr > mid) res += query(rs(p), mid + 1, r, nl, nr);
	return res;
}
int main() {
	scanf("%d%d", &n, &m);
	for(int i = 1;i <= n;i++) {
		scanf("%d", &a[i]);
		c[i] = a[i] - a[i - 1];
	}
	build(1, 1, n);
	for(int i = 1;i <= m;i++) {
		int op, x, y, z, k;
		scanf("%d", &op);
		if(op == 1) {
			scanf("%d%d%d%d", &x, &y, &z, &k);
			for(int j = 1;j <= 2 * n;j++) cout << ans[j] << " ";
			cout << endl;
			update(1, 1, n, x, x, z);
			update(1, 1, n, x + 1, y, k);
			update(1, 1, n, y + 1, y + 1, -k - (y - x) * z);
			for(int j = 1;j <= 2 * n;j++) cout << ans[j] << " ";
			cout << endl;
		}
		else {
			scanf("%d", &x);
			printf("%d\n", query(1, 1, n, 1, x));
		}
	}
}
2021/5/9 06:25
加载中...