社区讨论

悬关,分块裸题,WA,10分,只过了第二个点

P3870[TJOI2009] 开关参与者 2已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lypnjdm4
此快照首次捕获于
2024/07/17 17:40
2 年前
此快照最后确认于
2024/07/17 19:05
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
int n, m, B, L[MAXN], R[MAXN], cnt, sz[MAXN], a[MAXN], add[MAXN], num[MAXN], belong[MAXN];
void change(int l, int r) {
	int p = belong[l], q = belong[r];
	if (p == q) {
		for (int i = l; i <= r; i++) a[i] = 1 - a[i], num[p] += ((a[i] + add[p]) == 0 ? -1 : 1);
	}
	else {
		for (int i = l; i <= R[p]; i++) a[i] = 1 - a[i], num[p] += ((a[i] + add[p]) == 0 ? -1 : 1);
		for (int i = L[q]; i <= r; i++) a[i] = 1 - a[i], num[q] += ((a[i] + add[q]) == 0 ? -1 : 1);
		for (int i = p + 1; i < q; i++) add[i] = (add[i] + 1) % 2, num[i] = sz[i] - num[i];
	}
} 
int find(int l, int r) {
	int p = belong[l], q = belong[r];
	int ans = 0;
	if (p == q) {
		for (int i = l; i <= r; i++) ans += (a[i] + add[i]) % 2;
	}
	else {
		for (int i = l; i <= R[p]; i++) ans += (a[i] + add[p]) % 2;
		for (int i = L[q]; i <= r; i++) ans += (a[i] + add[q]) % 2;
		for (int i = p + 1; i < q; i++) ans += num[i];
	}
	return ans;
}
int main() {
	cin >> n >> m;
	B = sqrt(n);
	for (int i = 1; i <= n; i++) {
		if (i % B == 1) L[i / B] = i, cnt++;
		if (i % B == 0) R[i / B - 1] = i;
		belong[i] = (i - 1) / B;
	}
	R[cnt - 1] = n;
	for (int i = 0; i < cnt; i++) sz[i] = R[i] - L[i] + 1;
	for (int i = 1; i <= m; i++) {
		int type, l, r;
		cin >> type >> l >> r;
		if (type == 0) {
			change(l, r);
		}
		else {
			cout << find(l, r) << endl;
		}
	}
	return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...