Rt,按照题解里的分块写的,可是只有20。
#include <iostream>
#include <cmath>
#include <cstdio>
#include <string>
using namespace std;
long long int data[1000][2],tag[1000];
int st[1000],ed[1000],belong[100010],size[1000];
int num;
int a[500010];
string str;
void init (int n)
{
num = sqrt(n);
for (int i = 1; i <= num; i++)
{
st[i] = n / num * (i - 1) + 1;
ed[i] = n / num * i;
}
ed[num] = n;
for (int i = 1; i <= num; i++)
{
for (int j = st[i]; j <= ed[i]; j++)
{
belong[j] = i;
data[i][a[j]]++;
}
size[i] = ed[i] - st[i] + 1;
}
}
long long int query (int l,int r)
{
long long int ans=0;
int b=belong[l];
if (l!=st[belong[l]])
{
for (int i=l;i<=min(ed[belong[l]],r);i++)
{
ans+=a[i]^tag[b]?1:0;
//cerr<<i<<endl;
}
b++;
}
//cerr<<ans<<endl;
int e=belong[r];
if (r!=ed[belong[r]])
{
for (int i=max(st[belong[r]],st[b]);i<=r;i++)
{
ans+=a[i]^tag[e]?1:0;
//cerr<<i<<endl;
}
e--;
}
//cerr<<ans<<endl;
for (int i=b;i<=e;i++)
{
ans+=data[i][1^tag[i]];
}
return ans;
}
void add (int l,int r)
{
int b=belong[l];
if (l!=st[belong[l]])
{
for (int i=l;i<=min(ed[belong[l]],r);i++)
{
data[b][a[i]]--;
//cerr<<i<<" data:"<<a[i]<<" datak:"<<data[b]<<endl;
a[i]^=1;
data[b][a[i]]++;
//cerr<<i<<endl;
}
b++;
}
//cerr<<ans<<endl;
int e=belong[r];
if (r!=ed[belong[r]])
{
for (int i=max(st[belong[r]],l);i<=r;i++)
{
data[e][a[i]]--;
//cerr<<i<<" data:"<<a[i]<<" datak:"<<data[e]<<endl;
a[i]^=1;
data[e][a[i]]++;
//cerr<<i<<endl;
}
e--;
}
//cerr<<ans<<endl;
for (int i=b;i<=e;i++)
{
tag[i]^=1;
}
}
inline int read()
{
char c = getchar();
int x = 0, f = 1;
while (c < '0' || c > '9')
{
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
{
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
int main ()
{
int n,m;
cin>>n>>m;
cin>>str;
for (int i=1;i<=n;i++)
{
a[i]=str[i-1]-'0';
}
init(n);
while (m--)
{
int opt=read();
if (opt==0)
{
int x=read(),y=read();
add(x,y);
}
else
{
int x=read(),y=read();
printf ("%lld\n",query(x,y));
}
/*for (int i=1;i<=num;i++)
cerr<<data[i]<<" ";
cerr<<endl;
for (int i=1;i<=num;i++)
cerr<<tag[i]<<" ";
cerr<<endl;
for (int i=1;i<=n;i++)
cerr<<a[i]<<" ";
cerr<<endl;
cerr<<opt<<"~~~~~~~~~~~~~~~~"<<endl;*/
}
}