线段树RE,Segmentation fault求调
  • 板块学术版
  • 楼主wizardMarshall
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/12/27 13:00
  • 上次更新2023/10/24 06:26:30
查看原帖
线段树RE,Segmentation fault求调
474470
wizardMarshall楼主2022/12/27 13:00

站外题。区间 [1,n][1,n]

codecode :

#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[100005];
int lazy[100005];
int sum[100005];
void build(int l, int r, int x) {//建树
	if (l == r) {
		sum[x] = a[l];
		return ;
	}int m = (l + r) / 2;
	build(l, m, x * 2);
	build(m + 1, r, x * 2 + 1);
	sum[x] = sum[x * 2] + sum[x * 2 + 1];
}void pushdown(int x, int l, int r) {//下传懒惰标记
	int m = (l + r) / 2;
	if (lazy[x]) {
		lazy[x * 2] = lazy[x];sum[x * 2] += (m - l + 1) * lazy[x];
		lazy[x * 2 + 1] = lazy[x];sum[x * 2 + 1] += (r - m) * lazy[x];
		lazy[x] = 0;
	}
}void modify(int L, int R, int value, int l, int r, int x) {//增加操作
	if (L <= l && r <= R) {
		sum[x] += (r - l + 1) * value;
		lazy[x] += value;
		return;
	}pushdown(x, l, r);
	int m = (l + r) / 2;
	if (L <= m) {
		modify(L, R, value, l, m, x * 2);
	}if (R > m) {
		modify(L, R, value, m + 1, r, x * 2 + 1);
	}sum[x] = sum[x * 2] + sum[x * 2 + 1];
}int query(int L, int R, int l, int r, int x) {//查询
	if (L <= l && r <= R) {
		return sum[x];
	}pushdown(x, l, r);
	int m = (l + r) / 2;
	int ret = 0;
	if (L <= m) {
		ret += query(L, R, l, m, x * 2);
	}if (R > m) {
		ret += query(L, R, m + 1, r, x * 2 + 1);
	}return ret;
}signed main() {
	int n;scanf("%lld", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &a[i]);
	}build(1, n, 1);
	int m;scanf("%lld", &m);
	for (int i = 1; i <= m; i++) {
		getchar();
		char s = getchar();
		if (s == 'Q') {//查询
			int x, y, l;
			scanf("%lld%lld", &x, &y);
			printf("%lld\n", query(x, y, 1, n, 1));
		}else {//更新[x,y]区间增加z
			int x, y, z;
			scanf("%lld%lld%lld", &x, &y, &z);
			modify(x, y, z, 1, n, 1);
		}
	}return 0;
}

样例+本地数据未发现错误。

系统返回Runtime Error:Segmentation fault

2022/12/27 13:00
加载中...