代码如下 :
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
int n,q; string s;
int tree[4N],revse[4N];
void up(int i,int l,int r) { int mid=(l+r)>>1; tree[i]=(tree[i<<1] && tree[i<<1|1] && s[mid]!=s[mid+1]); }
void build(int l,int r,int i) { if(l==r) { tree[i]=1; return ; } int mid= (l+r)>>1; build(l,mid,i<<1); build(mid+1,r,i<<1|1); up(i,l,r); }
void lazy(int i,int l,int r) { revse[i]^=1; if(l!=r) { s[l]= ( s[l]=='0' ? '1' : '0' ); s[r]= ( s[r]=='0' ? '1' : '0' ); } else { s[l]= ( s[l]=='0' ? '1' : '0' ); } }
void down(int i,int l,int r) { if(revse[i]) { int mid=(l+r)>>1; lazy(i<<1,l,mid); lazy(i<<1|1,mid+1,r); revse[i]=0; } }
int query(int jobl,int jobr,int i,int l,int r) {
if(l>=jobl && r<=jobr)
{
return tree[i];
}
int mid=(l+r)>>1;
down(i,l,r);
int lef=-1,rig=-1;
if(jobl<=mid)
{
lef=query(jobl,jobr,i<<1,l,mid);
}
if(jobr>=mid+1)
{
rig=query(jobl,jobr,i<<1|1,mid+1,r);
}
if(lef==-1 && rig!=-1)
{
return rig;
}
else if(lef!=-1 && rig==-1)
{
return lef;
}
else
{
if(lef==1 && rig==1 && s[mid]!=s[mid+1])
return 1;
else
return 0;
}
}
void update(int jobl,int jobr,int l,int r,int i) { if(l>=jobl && r<=jobr) { lazy(i,l,r); return ; } int mid=(l+r)>>1; down(i,l,r); if(jobl<=mid) { update(jobl,jobr,l,mid,i<<1); } if(jobr>=mid+1) { update(jobl,jobr,mid+1,r,i<<1|1); } up(i,l,r); }
signed main(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n>>q>>s; s='#'+s; build(1,n,1); for(int i=1;i<=q;i++) { int op; cin>>op; if(op==1) { int l,r; cin>>l>>r; update(l,r,1,n,1); } if(op==2) { int l,r; cin>>l>>r; if(query(l,r,1,1,n)) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } } } return 0; }
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
int n,q; string s;
int tree[4*N],revse[4*N];
void up(int i,int l,int r)
{
int mid=(l+r)>>1;
tree[i]=(tree[i<<1] && tree[i<<1|1] && s[mid]!=s[mid+1]);
}
void build(int l,int r,int i)
{
if(l==r)
{
tree[i]=1;
return ;
}
int mid= (l+r)>>1;
build(l,mid,i<<1);
build(mid+1,r,i<<1|1);
up(i,l,r);
}
void lazy(int i,int l,int r)
{
revse[i]^=1;
if(l!=r)
{
s[l]= ( s[l]=='0' ? '1' : '0' );
s[r]= ( s[r]=='0' ? '1' : '0' );
}
else
{
s[l]= ( s[l]=='0' ? '1' : '0' );
}
}
void down(int i,int l,int r)
{
if(revse[i])
{
int mid=(l+r)>>1;
lazy(i<<1,l,mid);
lazy(i<<1|1,mid+1,r);
revse[i]=0;
}
}
int query(int jobl,int jobr,int i,int l,int r)
{
if(l>=jobl && r<=jobr)
{
return tree[i];
}
int mid=(l+r)>>1;
down(i,l,r);
int lef=-1,rig=-1;
if(jobl<=mid)
{
lef=query(jobl,jobr,i<<1,l,mid);
}
if(jobr>=mid+1)
{
rig=query(jobl,jobr,i<<1|1,mid+1,r);
}
if(lef==-1 && rig!=-1)
{
return rig;
}
else if(lef!=-1 && rig==-1)
{
return lef;
}
else
{
if(lef==1 && rig==1 && s[mid]!=s[mid+1])
return 1;
else
return 0;
}
}
void update(int jobl,int jobr,int l,int r,int i)
{
if(l>=jobl && r<=jobr)
{
lazy(i,l,r);
return ;
}
int mid=(l+r)>>1;
down(i,l,r);
if(jobl<=mid)
{
update(jobl,jobr,l,mid,i<<1);
}
if(jobr>=mid+1)
{
update(jobl,jobr,mid+1,r,i<<1|1);
}
up(i,l,r);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>q>>s;
s='#'+s;
build(1,n,1);
for(int i=1;i<=q;i++)
{
int op;
cin>>op;
if(op==1)
{
int l,r; cin>>l>>r;
update(l,r,1,n,1);
}
if(op==2)
{
int l,r; cin>>l>>r;
if(query(l,r,1,1,n))
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
}
return 0;
}