不知哪里出现问题
查看原帖
不知哪里出现问题
752094
MornHus楼主2023/2/19 10:20
#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0;
	char c=getchar();
	while(c>'9'||c<'0'){
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<1)+(x<<3)+(c^'0');
		c=getchar();
	}
	return x;
}
int n,m;
int opt;
bool a[200001];
int t[200001<<2];
bool lazy[200001<<2];
void pushup(int x){
	t[x]=t[x<<1]+t[x<<1|1];
}
void build(int x,int l,int r){
	if(l==r){
		t[x]+=a[l];
	}else{
		int mid=((l+r)>>1);
		build(x<<1,l,mid);
		build(x<<1|1,mid+1,r);
		pushup(x);
	}
}
void pushdown(int x,int l,int r){
	if(lazy[x]){
		int mid=((l+r)>>1);
		t[x<<1]=(l-mid+1)-t[x<<1];
		t[x<<1|1]=(r-mid)-t[x<<1|1];
		
		lazy[x<<1]^=1;
		lazy[x<<1|1]^=1;
		lazy[x]=0;
	}
}
void update(int x,int L,int R,int l,int r){
	pushdown(x,l,r);
	if(L<=l&&r<=R){
		lazy[x]^=1;
		t[x]=(l-r+1)-t[x];
	}else{
		int mid=((l+r)>>1);
		if(L<=mid){
			update(x<<1,L,R,l,mid);
		}
		if(R>mid){
			update(x<<1|1,L,R,mid+1,r);
		}
		pushup(x);
	}
}
int query(int x,int L,int R,int l,int r){
	pushdown(x,l,r);
	if(L<=l&&r<=R){
		return t[x];
	}else{
		int mid=((l+r)>>1);
		int res=0;
		if(L<=mid){
			res+=query(x<<1,L,R,l,mid);
		}
		if(R>mid){
			res+=query(x<<1|1,L,R,mid+1,r);
		}
		pushup(x);
		return res;
	}
}
int main(){
	n=read();
	m=read();
	for(int i=1;i<=n;i++){
		a[i]=getchar()-'0';
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		opt=read();
		int left=read();
		int right=read();
		if(opt){
			printf("%d\n",query(1,left,right,1,n));
		}else{
			update(1,left,right,1,n);
		}
	}
	return 0;
} 
2023/2/19 10:20
加载中...