这个代码为啥错了?样例都没过
查看原帖
这个代码为啥错了?样例都没过
464528
见贤思齐_Seakies楼主2022/4/25 12:33
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
int n, m, a[MAXN], sum[MAXN * 4], tl[MAXN * 4], tr[MAXN * 4], tmid[MAXN * 4], lazy_tag[MAXN * 4];
char s[MAXN];
void push_up(int o) {
	sum[o] = sum[o * 2] + sum[o * 2 + 1];
}
void push_down(int o) {
	if (lazy_tag[o]) {
		lazy_tag[o * 2] ^= 1;
		lazy_tag[o * 2 + 1] ^= 1;
		sum[o * 2] = tr[o * 2] - tl[o * 2] + 1 - sum[o * 2];
		sum[o * 2 + 1] = tr[o * 2 + 1] - tl[o * 2 + 1] + 1 - sum[o * 2 + 1];
		lazy_tag[o] = 0;
	}
}
void build(int o, int l, int r) {
	tl[o] = l, tr[o] = r; 
	if (l == r) {
		sum[o] = a[l];
		return;
	}
	tmid[o] = (l + r) / 2;
	build(o * 2, l, tmid[o]);
	build(o * 2 + 1, tmid[o] + 1, r);
	push_up(o);
}
void modify(int o, int l, int r) {
	if (tl[o] == l && tr[o] == r) {
		sum[o] = tr[o] - tl[o] + 1 - sum[o];
		lazy_tag[o] ^= 1;
		return;
	}
	push_down(o);
	if (r <= tmid[o]) modify(o * 2, l, r);
	else if (l > tmid[o]) modify(o * 2 + 1, l, r);
	else {
		modify(o * 2, l, tmid[o]);
		modify(o * 2 + 1, tmid[o] + 1, r);
		push_up(o);
	}
}
int query(int o, int l, int r) {
	if (tl[o] == l && tr[o] == r) return sum[o];
	push_down(o);
	if (r <= tmid[o]) return query(o * 2, l, r);
	if (l > tmid[o]) return query(o * 2 + 1, l, r);
	return query(o * 2, l, tmid[o]) + query(o * 2 + 1, tmid[o] + 1, r);
}
int main() {
	cin >> n >> m >> s;
	for (int i = 0; i < n; i++) {
		a[i + 1] = s[i] - '0';
	}
	build(1, 1, n);
	while (m--) {
		int op, l, r;
		cin >> op >> l >> r;
		if (op == 0) {
			modify(1, l, r);
//			for (int i = 1; i <= n; i++) {
//				for (int j = i; j <= n; j++) {
//					cout << i << ' ' << j << ' ' << query(1, i, j) << endl;
//				}
//			}
		}
		else cout << query(1, l, r) << endl;
	}
	return 0;
}
2022/4/25 12:33
加载中...