zkw线段树玄学错误?
查看原帖
zkw线段树玄学错误?
489661
lateworker楼主2024/7/19 11:04

求助(已AC)

错误代码:

#include <bits/stdc++.h>
#define C__ const
#define int long long
using namespace std;
C__ int N_ = 1e5 + 10, inf = 0x3f3f3f3f3f3f3f3fLL;
struct Data {
	int sum, ma;
	Data() { sum = 0, ma = -inf; }
	Data(C__ int &a, C__ int &b) { sum = a, ma = b; }
} st[N_ << 2];
#define le (u << 1)
#define ri (u << 1 | 1)
int n, m, a[N_], tn;
void push_up(int u) { st[u].sum = st[le].sum + st[ri].sum, st[u].ma = max(st[le].ma, st[ri].ma); }
void build() {
	for (tn = 1; tn <= n + 1; tn <<= 1);
	for (int i = 1; i <= n; i++) st[i + tn] = { a[i], a[i] };
	for (int u = tn - 1; u; u--) push_up(u);
}
int query(int l, int r) {
	int ret = 0;
	for (l += tn - 1, r += tn + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
		if (~l & 1) ret += st[l ^ 1].sum;
		if (r & 1) ret += st[r ^ 1].sum;
	}
	return ret;
}
void modify(int u, int V) {
	u += tn; st[u] = {V, V};
	for (u >>= 1; u; u >>= 1)
		push_up(u);
}
void dfs(int u, int P) {
	if (st[u].ma < P) return;
	if (u >= tn) return st[u].sum %= P, st[u].ma %= P, void();
	dfs(le, P), dfs(ri, P);
	push_up(u);
}
void update(int l, int r, int P) {
	int _l = l, _r = r;
	for (l += tn - 1, r += tn + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
		if (~l & 1) dfs(l ^ 1, P);
		if (r & 1) dfs(r ^ 1, P);
	}
	l = _l + tn - 1, r = _r + tn + 1;
	for (l >>= 1, r >>= 1; l ^ r ^ 1; l >>= 1, r >>= 1) 
		push_up(l), push_up(r);
	for (l >>= 1; l; l >>= 1) push_up(l);
}
signed main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i];
	build();
	while (m--) {
		int c, l, r, k, x;
		cin >> c;
		if (c == 1) {
			cin >> l >> r;
			cout << query(l, r) << "\n";
		} else if (c == 2) {
			cin >> l >> r >> x;
			update(l, r, x);
		} else {
			cin >> k >> x;
			modify(k, x);
		}
	}
	return 0;
}

正确代码:

#include <bits/stdc++.h>
#define C__ const
#define int long long
using namespace std;
C__ int N_ = 1e5 + 10, inf = 0x3f3f3f3f3f3f3f3fLL;
struct Data {
	int sum, ma;
	Data() { sum = 0, ma = -inf; }
	Data(C__ int &a, C__ int &b) { sum = a, ma = b; }
} st[N_ << 2];
#define le (u << 1)
#define ri (u << 1 | 1)
int n, m, a[N_], tn;
void push_up(int u) { st[u].sum = st[le].sum + st[ri].sum, st[u].ma = max(st[le].ma, st[ri].ma); }
void build() {
	for (tn = 1; tn <= n + 1; tn <<= 1);
	for (int i = 1; i <= n; i++) st[i + tn] = { a[i], a[i] };
	for (int u = tn - 1; u; u--) push_up(u);
}
int query(int l, int r) {
	int ret = 0;
	for (l += tn - 1, r += tn + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
		if (~l & 1) ret += st[l ^ 1].sum;
		if (r & 1) ret += st[r ^ 1].sum;
	}
	return ret;
}
void modify(int u, int V) {
	u += tn; st[u] = {V, V};
	for (u >>= 1; u; u >>= 1)
		push_up(u);
}
void dfs(int u, int P) {
	if (st[u].ma < P) return;
	if (u >= tn) return st[u].sum %= P, st[u].ma %= P, void();
	dfs(le, P), dfs(ri, P);
	push_up(u);
}
void update(int l, int r, int P) {
	for (l += tn - 1, r += tn + 1; l ^ r ^ 1; l >>= 1, r >>= 1) {
		if (~l & 1) dfs(l ^ 1, P);
		if (r & 1) dfs(r ^ 1, P);
		push_up(l >> 1), push_up(r >> 1);
	}
	for (l >>= 1; l; l >>= 1) push_up(l);
}
signed main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) cin >> a[i];
	build();
	while (m--) {
		int c, l, r, k, x;
		cin >> c;
		if (c == 1) {
			cin >> l >> r;
			cout << query(l, r) << "\n";
		} else if (c == 2) {
			cin >> l >> r >> x;
			update(l, r, x);
		} else {
			cin >> k >> x;
			modify(k, x);
		}
	}
	return 0;
}

Wa on #3,错误代码的push_up有什么问题?

2024/7/19 11:04
加载中...