求助
查看原帖
求助
285617
黑影洞人楼主2022/2/1 22:33
#include<cstdio>
#include<algorithm>
#define lc p<<1
#define rc p<<1|1 
#define N 233715
using namespace std;
struct suky{
	int l,r,tag,sum;
}s[4*N];
int n,m,a[N];
char suk[N];
void pushup(int p){
	s[p].sum=s[lc].sum+s[rc].sum;
}
void build(int p,int l,int r){
	s[p].l=l,s[p].r=r;
	if(l==r){
		//printf("%d,%d\n",l,a[l]);
		s[p].sum=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(p);
}
void pushdown(int p,int len){
	//printf("%d:%d\n",p,s[p].sum);
	if(!s[p].tag)return;
	s[lc].tag^=1;
	s[rc].tag^=1;
	s[lc].sum=len-(len>>1)-s[lc].sum;
	s[rc].sum=(len>>1)-s[rc].sum;
	s[p].tag=0;
}
void change(int p,int l,int r){
	if(s[p].l>r||s[p].r<l)return;
	if(s[p].l>=l&&s[p].r<=r){
		s[p].tag^=1;
		s[p].sum=r-l+1-s[p].sum;
		return;
	}
	pushdown(p,r-l+1);
	change(lc,l,r);
	change(rc,l,r);
	pushup(p);
}
int query(int p,int l,int r){
	if(s[p].l>r||s[p].r<l)return 0;
	if(s[p].l>=l&&s[p].r<=r){
		return s[p].sum;
	}
	pushdown(p,r-l+1);
	return query(lc,l,r)+query(rc,l,r);
}
signed main(){
	scanf("%d%d",&n,&m);
	scanf("%s",suk+1);
	for(int i=1;i<=n;i++)a[i]=suk[i]-'0';
	build(1,1,n);
//	for(int i=1;i<=4*n;i++)printf("%d:%d\n",i,s[i].sum); 
	for(int i=1;i<=m;i++){
		int op,a,b;
		scanf("%d%d%d",&op,&a,&b);
		if(op==0)change(1,a,b);
		else printf("%d\n",query(1,a,b));
	}
	return 0;
}



2022/2/1 22:33
加载中...