萌新复习分块寄了 只有样例和第一个点过了,感觉写的没问题啊 (内附部分过程量输出,注释的内容)
#include <bits/stdc++.h>
const int MAXN = 2e5 + 10;
#define int long long
using namespace std;
char s[MAXN];
int n, m, a[MAXN], t, q[MAXN], z[MAXN], y[MAXN], res[MAXN], lazy[MAXN];
void change(int l, int r)
{
int L = q[l], R = q[r];
if(L == R)
{
for (int i = l; i <= r; i++)
{
if(a[i] == 0) res[L]++, a[i] = 1;
else res[L]--, a[i] = 0;
}
}
else
{
for (int i = l; i <= y[L]; i++)
{
if(a[i] == 0) res[L]++, a[i] = 1;
else res[L]--, a[i] = 0;
}
for (int i = L + 1; i <= R - 1; i++) lazy[i]++;
for (int i = z[R]; i <= r; i++)
{
if(a[i] == 0) res[R]++, a[i] = 1;
else res[R]--, a[i] = 0;
}
}
}
int query(int l, int r)
{
int L = q[l], R = q[r];
if(L == R)
{
int ans = 0;
for (int i = l; i <= r; i++)
{
if((a[i] + lazy[i]) % 2 == 1) ans++;
}
return ans;
}
else
{
int ans = 0;
for (int i = l; i <= y[L]; i++)
{
if((a[i] + lazy[L]) % 2 == 1) ans++;
}
for (int i = L + 1; i <= R - 1; i++)
{
if(lazy[i] % 2 == 0) ans += res[i];
else ans += (y[i] - z[i] + 1 - res[i]);
}
for (int i = z[R]; i <= r; i++)
{
if((a[i] + lazy[R]) % 2 == 1) ans++;
}
return ans;
}
}
signed main()
{
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++)
{
cin >> s[i];
a[i] = s[i] - '0';
}
t = sqrt(n);
for (int i = 1; i <= t; i++)
{
z[i] = (i - 1) * t + 1;
y[i] = i * t;
}
if(y[t] < n) t++, z[t] = y[t - 1] + 1, y[t] = n;
for (int i = 1; i <= t; i++)
{
for (int j = z[i]; j <= y[i]; j++)
{
q[j] = i;
res[i] += a[j];
}
}
/*cout << endl;
cout << "t: " << t << endl;
for (int i = 1; i <= t; i++) cout << z[i] << " " << y[i] << endl;
cout << endl;
for (int i = 1; i <= t; i++) cout << res[i] << " q[i]: " << q[i] << endl;*/
for (int i = 1; i <= m; i++)
{
int op, l, r;
scanf("%lld%lld%lld", &op, &l, &r);
if(op == 0)
{
change(l, r);
//for (int i = 1; i <= n; i++)
//{
// printf("%lld ", (a[i] + lazy[q[i]]) % 2);
//}
//cout << endl;
}
else printf("%lld\n", query(l, r));
}
return 0;
}