这是蒟蒻的代码,已A:
#include<bits/stdc++.h>
#define lc (k<<1)
#define rc (k<<1|1)
using namespace std;
const int N=2e5;
int n,m;
bool a[N+5],lztag[N*4+5];
int sum[N*4+5];
void build(int k,int l,int r){
if(l==r){
sum[k]=a[l];
return;
}
int mid=l+r>>1;
build(lc,l,mid);
build(rc,mid+1,r);
sum[k]=sum[lc]+sum[rc];
}
void pushdown(int k,int l,int r){
if(!lztag[k])return;
int mid=l+r>>1;
sum[lc]=(mid-l+1)-sum[lc];
lztag[lc]=!lztag[lc];
sum[rc]=(r-mid)-sum[rc];
lztag[rc]=!lztag[rc];
lztag[k]=0;
}
void change(int k,int l,int r,int x,int y){
if(r<x||l>y)return;
if(l==r){
sum[k]=!sum[k];
return;
}
if(l>=x&&r<=y){
lztag[k]=!lztag[k];
sum[k]=(r-l+1)-sum[k];
return;
}
pushdown(k,l,r);
int mid=l+r>>1;
change(lc,l,mid,x,y);
change(rc,mid+1,r,x,y);
sum[k]=sum[lc]+sum[rc];
}
int query(int k,int l,int r,int x,int y){
if(r<x||l>y)return 0;
if(l>=x&&r<=y)return sum[k];
pushdown(k,l,r);
int mid=l+r>>1;
return query(lc,l,mid,x,y)+query(rc,mid+1,r,x,y);
}
int main(){
scanf("%d%d\n",&n,&m);
for(int i=1;i<=n;i++){
char c=getchar();
a[i]=c^48;
}
build(1,1,n);
while(m--){
bool op;
int l,r;
scanf("%d%d%d",&op,&l,&r);
if(!op)
change(1,1,n,l,r);
else
printf("%d\n",query(1,1,n,l,r));
}
}
然而,把while(m--)改成for(int i=1;i<=m;i++)后,在本地运行样例i一直是1,i++似乎根本没执行
提交只能得40分(WA6个点),吸氧又能过
求大佬解答