分块10pts玄关求调
查看原帖
分块10pts玄关求调
573977
Zcras楼主2024/10/15 21:07
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,a[N],b[N],c[N],id[N],len;
void opc(int i){
	if(a[i]*b[id[i]]==1){
		c[id[i]]++;
	}else{
		c[id[i]]--;
	}
}
void change(int l,int r){
	int sid=id[l],eid=id[r];
	if(sid==eid){
		for(int i=l;i<=r;i++){
			a[i]=-a[i];
			opc(i);
		}
	}else{
		for(int i=l;id[i]==sid;i++){
			a[i]=-a[i];
			opc(i);
		}
		for(int i=sid+1;i<eid;i++){
			b[i]=-b[i];
			c[i]=len-c[i];
		}
		for(int i=r;id[i]==eid;i--){
			a[i]=-a[i];
			opc(i);
		}
	}
}
int query(int l,int r){
	int sid=id[l],eid=id[r];
	int ans=0; 
	if(sid==eid){
		for(int i=l;i<=r;i++){
			if(a[i]*b[sid]==1){
				ans++;
			}
		}
	}else{
		for(int i=l;id[i]==sid;i++){
			if(a[i]*b[sid]==1){
				ans++;
			}
		}
		for(int i=sid+1;i<eid;i++){
			if(b[i]==-1){
				ans+=(len-c[i]);
			}else{
				ans+=c[i];
			}
		}
		for(int i=r;id[i]==eid;i--){
			if(a[i]*b[sid]==1){
				ans++;
			}
		}
	}
	return ans;
}
int main(){
	cin>>n>>m;
	len=sqrt(n);
	for(int i=1;i<=n;i++){
		a[i]=-1,b[i]=1;
		id[i]=(i-1)/len+1;
	}
	int c,a,b;
	for(int i=1;i<=m;i++){
		cin>>c;
		if(c==0){
			cin>>a>>b;
			change(a,b);
		}else{
			cin>>a>>b;
			cout<<query(a,b)<<endl;
		}
	}
	return 0;
} 
2024/10/15 21:07
加载中...