请问我写的线段树有社么问题吗....一输入就“该内存不能为read”
  • 板块学术版
  • 楼主Stevehim
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/10/28 11:07
  • 上次更新2023/10/27 05:28:22
查看原帖
请问我写的线段树有社么问题吗....一输入就“该内存不能为read”
759274
Stevehim楼主2022/10/28 11:07
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <string>
#define maxn 100010
using namespace std;

struct tree {
	int l, r; //左儿子右儿子
	long long pre, add; //结点值和懒标记
} t[maxn];
int a[maxn]; //存储值
int n, m;

void build(int p, int l, int r) { //p为当前结点编号,l、r为左右儿子
	t[p].l = l;
	t[p].r = r;
	if (l == r) {
		t[p].pre = a[l]; //区间只有一个值为要求,令维护的值为该值
		return;
	}
	int mid = (r + l) / 2; //二分套一下
	build(p * 2, l, mid); //左儿子
	build(p * 2 + 1, mid + 1, r); //右儿子
	t[p].pre = t[p * 2].pre + t[p * 2 + 1].pre; //此时维护的值为自己的两个儿子维护值之和
}

void spread(int p) { //线段树的精髓
	if (t[p].add) { //如果懒标记不是0就下传
		t[p * 2].pre += t[p].add * (t[p * 2].r - t[p * 2].l + 1); //区间所有值加上懒标记
		t[p * 2 + 1].pre += t[p].add * (t[p * 2 + 1].r - t[p * 2 + 1].l + 1);
		t[p * 2].add = t[p].add, t[p * 2 + 1].add = t[p].add;
		t[p].add = 0;
	}
}

void change(int p, int x, int y, int z) { //修改的结点编号;右区间;左区间;修改的值
	if (x <= t[p].l && y >= t[p].r) {
		t[p].pre += (long long)z * (t[p].r - t[p].l + 1);
		t[p].add += z;
		return;
	}
	spread(p);
	int mid = (t[p].l + t[p].r) / 2;
	if (x <= mid) {
		change(p * 2, x, y, z);
	}
	if (y > mid) {
		change(p * 2 + 1, x, y, z);
	}
	t[p].pre = t[p * 2].pre + t[p * 2 + 1].pre;
}

long long ask(int p, int x, int y) {
	if (x <= t[p].l && y > t[p].r) {
		cout << "ok3" << endl;
		return t[p].pre;
	}
	spread(p);
	int mid = (t[p].l + t[p].r) / 2;
	long long ans = 0;
	if (x <= mid) {
		ans += ask(p * 2, x, y);
	}
	if (y > mid) {
		ans += ask(p * 2 + 1, x, y);
	}
	cout << "ok2" << endl;
	return ans;
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	build(1, 1, n);
	int op;
	int x, y, z;
	for (int i = 1; i <= m; i++) {
		scanf("%d", &op);
		cout << "ok" << endl;
		if (op == 1) {
			scanf("%d%d%d", &x, &y, &z);
			change(1, x, y, z);
		} else {
			scanf("%d%d", &x, &y);
			cout << "ok" << endl;
			long long ans = ask(1, x, y);
			cout << "ok1" << endl;
			cout << ans << endl;
		}
	}
	return 0;
}

2022/10/28 11:07
加载中...