WA + TLE + RE + AC
蒟蒻分块代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int maxm = 1e5 + 5;
int n, m, siz, num;
int a[maxn], L[maxm], R[maxm], bel[maxn];
int sum[maxm];
int tag[maxm];
inline void build(){
scanf("%d%d", &n, &m);
siz = pow(n, 2.0 / 3);
num = ceil(n / siz);
for(int i = 1; i <= n; i++){
a[i] = 0;
bel[i] = (i - 1) / siz + 1;
sum[bel[i]] += a[i];
}
for(int i = 1; i <= num; i++){
L[i] = (i - 1) * siz + 1;
R[i] = min(n, i * siz);
}
}
inline void add(int l, int r){
if(bel[l] == bel[r]){
for(int i = l; i <= r; i++){
a[i] = !a[i];
}
return;
}
else{
int p = bel[l], q = bel[r];
for(int i = p + 1; i <= q - 1; i++){
tag[i] ++;
}
for(int i = l; i <= R[p]; i++){
sum[i] -= a[i];
a[i] = !a[i];
sum[i] += a[i];
}
for(int i = r; i >= L[q]; i--){
sum[i] -= a[i];
a[i] = !a[i];
sum[i] += a[i];
}
}
}
inline int ask(int l, int r){
int ans = 0;
if(bel[l] == bel[r]){
for(int i = l; i <= r; i++){
ans += (a[i] + (tag[bel[l]] & 1 ? 1 : 0)) % 2;
}
return !printf("%d\n", ans);
}
else{
int p = bel[l], q = bel[r];
for(int i = l; i <= R[p]; i++){
ans += (a[i] + tag[p] & 1 ? 1 : 0) % 2;
}
for(int i = r; i >= L[q]; i--){
ans += (a[i] + tag[bel[r]] & 1 ? 1 : 0) % 2;
}
for(int i = p + 1; i <= q - 1; i++){
if(tag[i] & 1){
ans += siz - sum[i];
}
else{
ans += sum[i];
}
}
return !printf("%d\n", ans);
}
}
int main(){
build();
while(m --> 0){
int opt, l, r;
scanf("%d%d%d", &opt, &l, &r);
if(opt == 0){
add(l, r);
}
else{
ask(l, r);
}
}
return 0;
}