样例能过,但10pts,求调
查看原帖
样例能过,但10pts,求调
754444
tamamocross楼主2023/8/20 10:35
#include<iostream>
using namespace std;
const int Max=1e5+1;
int sum[4*Max],tag[4*Max];
void update(int l,int r,int m,int p){
	tag[2*p]=1;tag[2*p+1]=1;
	sum[2*p]=(m-l+1-sum[2*p]);sum[2*p+1]=(r-m-sum[2*p+1]);
	tag[p]=0;	
}
void add(int l,int r,int L,int R,int p){
	if(l<=L&&r>=R){
		sum[p]=(R-L+1-sum[p]);     
		if(tag[p]==1){
			tag[p]=0;
		}else{
			tag[p]=1;
		}
		return;
	}	
	int m=(L+R)/2;	
	if(tag[p]){
		update(L,R,m,p);		
	}
	if(l<=m)add(l,r,L,m,2*p);
	if(r>m)add(l,r,m+1,R,2*p+1);				
	sum[p]=sum[2*p]+sum[2*p+1];			
}
int query(int l,int r,int L,int R,int p){	
	if(l<=L&&r>=R){
		return sum[p];
	}
	int ans=0;
	int m=(L+R)/2;	
	if(tag[p]){
		update(L,R,m,p);
	}
	int sum=0;
	if(l<=m)sum=query(l,r,L,m,2*p);
	if(r>m)sum+=query(l,r,m+1,R,2*p+1);
	return sum;
}
int main(){
	int n,m;
	cin>>n>>m;
	while(m--){
		int opt,l,r;
		cin>>opt>>l>>r;
		if(opt==0){
			add(l,r,1,n,1);
		}else{
			cout<<query(l,r,1,n,1)<<endl;	
		}
	}
	/*for(int i=1;i<=4*n;i++){
		cout<<sum[i]<<endl;
	}*/
} 
2023/8/20 10:35
加载中...