这样对了
#include<bits/stdc++.h>
using namespace std;
const int N=2*1e6;
int lazy[4*N];
int value[4*N];
int n,m;
char a[N];
int v[N];
void push_up(int k)
{
value[k]=value[2*k]+value[2*k+1];
}
void push_down(int k,int size)
{
if(lazy[k])
{
lazy[k*2]=lazy[2*k]^1;
lazy[k*2+1]=lazy[k*2+1]^1;
value[k*2]=( size-( size >>1 ) )-value[k*2];
value[k*2+1]=( ( size )>>1 ) -value[k*2+1];
lazy[k]^=1;
}
}
//build 可能有问题
inline void build(int k,int l,int r)
{
if(l==r)
{
value[k]=v[l];
return;
}
int mid;
mid=(l+r)>>1;
build(2*k,l,mid);
build(2*k+1,mid+1,r);
push_up(k);
}
void update(int k,int l,int r,int ln,int rn)
{
push_down(k,r-l+1);
if(l>=ln && r<=rn)
{
lazy[k]=lazy[k]^1;
value[k]=r-l+1-value[k];
return ;
}
int mid;
mid=(l+r)>>1;
if(ln<=mid)
{
update(2*k,l,mid,ln,rn);
}
if(rn>mid)
{
update(2*k+1,mid+1,r,ln,rn);
}
push_up(k);
}
long long question(int k,int l,int r,int ln,int rn)
{
if(l>=ln &&r<=rn)
{
return value[k];
}
push_down(k,r-l+1);
int mid=(l+r)>>1;
long long ans=0;
if(ln<=mid)
{
ans+=question(2*k,l,mid,ln,rn);
}
if(rn>mid)
{
ans+=question(2*k+1,mid+1,r,ln,rn);
}
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
v[i]=a[i]-'0';
cout<<v[i]<<" ";
}
cout<<endl;
build(1,1,n);
for(int i=1;i<=m;i++)
{
int q,l,r;
cin>>q>>l>>r;
if(q==0)
{
update(1,1,n,l,r);
}
if(q==1)
{
cout<<question(1,1,n,l,r)<<endl;
}
}
return 0;
}
但是这样就错了
#include<bits/stdc++.h>
using namespace std;
const int N=2*1e6;
int lazy[4*N];
int value[4*N];
int n,m;
char a[N];
int v[N];
string b;
void push_up(int k)
{
value[k]=value[2*k]+value[2*k+1];
}
void push_down(int k,int size)
{
if(lazy[k])
{
lazy[k*2]=lazy[2*k]^1;
lazy[k*2+1]=lazy[k*2+1]^1;
value[k*2]=( size-( size >>1 ) )-value[k*2];
value[k*2+1]=( ( size )>>1 ) -value[k*2+1];
lazy[k]^=1;
}
}
//build 可能有问题
inline void build(int k,int l,int r)
{
if(l==r)
{
value[k]=v[l];
return;
}
int mid;
mid=(l+r)>>1;
build(2*k,l,mid);
build(2*k+1,mid+1,r);
push_up(k);
}
void update(int k,int l,int r,int ln,int rn)
{
push_down(k,r-l+1);
if(l>=ln && r<=rn)
{
lazy[k]=lazy[k]^1;
value[k]=r-l+1-value[k];
return ;
}
int mid;
mid=(l+r)>>1;
if(ln<=mid)
{
update(2*k,l,mid,ln,rn);
}
if(rn>mid)
{
update(2*k+1,mid+1,r,ln,rn);
}
push_up(k);
}
long long question(int k,int l,int r,int ln,int rn)
{
if(l>=ln &&r<=rn)
{
return value[k];
}
push_down(k,r-l+1);
int mid=(l+r)>>1;
long long ans=0;
if(ln<=mid)
{
ans+=question(2*k,l,mid,ln,rn);
}
if(rn>mid)
{
ans+=question(2*k+1,mid+1,r,ln,rn);
}
return ans;
}
int main()
{
cin>>n>>m;
// for(int i=1;i<=n;i++)
// {
// cin>>a[i];
// v[i]=a[i]-'0';
// cout<<v[i]<<" ";
// }
// cout<<endl;
cin>>b;
for(int i=0;i<b.size();i++)
{
v[i]=b[i]-'0';
cout<<v[i]<<" ";
}
cout<<endl;
build(1,1,n);
for(int i=1;i<=m;i++)
{
int q,l,r;
cin>>q>>l>>r;
if(q==0)
{
update(1,1,n,l,r);
}
if(q==1)
{
cout<<question(1,1,n,l,r)<<endl;
}
}
return 0;
}
注意:中间字符转数组的方式不一样,但是转换后的数组是一样的,而且第1份代码过了(中间输出了转换后的数组注释掉才能过)