线段树0pts全RE求助
查看原帖
线段树0pts全RE求助
285373
BlachSnake楼主2021/1/23 11:30
#include<iostream>
using namespace std;
struct Segment_Tree{int num,tag;}t[524288];
int n,m,o,l,r;
char c[262144];
void Getup(int d){
	t[d].num=t[d<<1].num+t[d<<1|1].num;
}
void PushDown(int d,int q){
	if(t[d].tag){
		t[d<<1].tag^=1;
		t[d<<1|1].tag^=1;
		t[d<<1].num=(q-(q>>1))-t[d<<1].num;
		t[d<<1|1].num=(q>>1)-t[d<<1|1].num;
		t[d].tag=0;
	}
}
void Build(int b,int e,int d){
	if(b==e){
		t[d].num=c[b];
		return;
	}
	int mid=(b+e)>>1;
	Build(b,mid,d<<1);
	Build(mid+1,e,d<<1|1);
	Getup(d);
}
void Change(int b,int e,int d){
	PushDown(d,e-b+1);
	if(l<=b&&e<=r){
		t[d].tag^=1;
		t[d].num=e-b+1-t[d].num;
		return;
	}
	int mid=(b+e)>>1;
	if(l<=mid)Change(b,mid,d<<1);
	if(mid+1<=r)Change(mid+1,e,d<<1|1);
	Getup(d);
}
int Query(int b,int e,int d){
	if(l<=b&&e<=r)return t[d].num;
	PushDown(d,e-b+1);
	int mid=(b+e)>>1,s=0;
	if(l<=mid)s+=Query(b,m,d<<1);
	if(mid+1<=r)s+=Query(m+1,e,d<<1|1);
	return s;
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m>>c+1;
	for(int i=1;i<=n;i++)c[i]-=48;
	Build(1,n,1);
	while(m--){
		cin>>o>>l>>r;
		if(o==0)Change(1,n,1);
		else cout<<Query(1,n,1)<<endl;
	}
	return 0;
}

RT

2021/1/23 11:30
加载中...