社区讨论
悬关,分块裸题,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 条回复,欢迎继续交流。
正在加载回复...