RT,初学分块,WA 0 了qwq
代码:
#include <stdio.h>
#include <math.h>
int belong[100007], lft[327], rt[327], a[100007], tag[327], sum[327];
inline void brute_force_update(int l, int r){
if (tag[belong[l]] == 1){
for (int i = lft[belong[l]]; i <= rt[belong[l]]; i++){
a[i] ^= 1;
}
sum[belong[l]] = (rt[belong[l]] - lft[belong[l]] + 1) - sum[belong[l]];
tag[belong[l]] = 0;
}
for (int i = l; i <= r; i++){
sum[belong[l]] += (a[i] ^ 1) - a[i];
a[i] ^= 1;
}
}
inline void update(int l, int r){
int l_ = belong[l - 1] + 1, r_ = belong[r + 1] - 1;
brute_force_update(l, rt[belong[l - 1]]);
brute_force_update(lft[belong[r + 1]], r);
for (int i = l_; i <= r_; i++){
tag[i] ^= 1;
}
}
inline int brute_force_query(int l, int r){
int ans = 0;
for (int i = l; i <= r; i++){
ans += a[i];
}
return ans;
}
inline int query(int l, int r){
int l_ = belong[l - 1] + 1, r_ = belong[r + 1] - 1, ans = brute_force_query(l, rt[belong[l - 1]]) + brute_force_query(lft[belong[r + 1]], r);
for (int i = l_; i <= r_; i++){
if (tag[i] == 0){
ans += sum[i];
} else {
ans += (rt[i] - lft[i] + 1) - sum[i];
}
}
return ans;
}
int main(){
int n, m, k;
scanf("%d %d", &n, &m);
k = sqrt(n);
for (register int i = 1; i <= n; i++){
belong[i] = (i + k - 1) / k;
}
for (register int i = 1; i <= k; i++){
lft[i] = (i - 1) * k + 1;
rt[i] = i * k;
}
if (rt[k] < n){
k++;
lft[k] = rt[k - 1] + 1;
rt[k] = n;
}
k++;
lft[k] = rt[k - 1] + 1;
rt[k] = n + 1;
belong[n + 1] = k + 1;
for (register int i = 1; i <= m; i++){
int c, a, b;
scanf("%d %d %d", &c, &a, &b);
if (c == 0){
update(a, b);
} else {
printf("%d\n", query(a, b));
}
}
return 0;
}