10ptsRE求调
查看原帖
10ptsRE求调
1111742
mincrafter_or_cy楼主2024/11/21 20:30
#include<iostream>
using namespace std;
const int N=1e5+5;
const int maxtot=5e3+5;
int sum[maxtot]={0},s[maxtot],t[maxtot];
bool val[N]={0};
bool bedone[maxtot]={0};
int size,tot,n,m;
int getid(int);
int sqrt(int);
void change(int,int);
int getsum(int,int);
void pushdown(int);
int main(){
	ios::sync_with_stdio(0);
	cin>>n>>m;
	size=sqrt(n);
	tot=size+(n%size>0?1:0);
	for(int i=1;i<=tot;i++){
		s[i]=(i-1)*size+1;
		t[i]=i*size;
	}
	int a,b,c;
	while(m--){
		cin>>c>>a>>b;
		if(c) cout<<getsum(a,b)<<endl;
		else change(a,b);
	}
	return 0;
}
int sqrt(int x){
	int ret,l=0,r=x,mid;
	while(l<=r){
		mid=(l+r)>>1;
		if(mid*mid==x) return mid;
		if(mid*mid<x){
			ret=mid;
			l=mid+1;
		}
		else r=mid-1;
	}
	return ret;
}
int getid(int x){
	return (x+size-1)/size;
}
void pushdown(int x){
	if(!bedone[x]) return;
	for(int i=s[x];i<=t[x];i++)
		val[i]=!val[i];
	bedone[x]=0;
}
void change(int l,int r){
	int a=getid(l),b=getid(r);
	if(a==b){
		for(int i=l;i<=r;i++){
			val[i]=!val[i];
			if(val[i]) sum[a]++;
			else sum[a]--;
		}
		return;
	}
	for(int i=l;i<=t[a];i++){
		val[i]=!val[i];
		if(val[i]) sum[a]++;
		else sum[a]--;
	}
	for(int i=s[b];i<=r;i++){
		val[i]=!val[i];
		if(val[i]) sum[b]++;
		else sum[b]--;
	}
	for(int i=a+1;i<b;i++){
		sum[i]=size-sum[i];
		bedone[i]=!bedone[i];
	}
}
int getsum(int l,int r){
	int ret=0,a=getid(l),b=getid(r);
	pushdown(a);
	pushdown(b);
	if(a==b){
		for(int i=l;i<=r;i++)
			if(val[i]) ret++;
		return ret;
	}
//	cerr<<a<<" "<<b<<endl;
	for(int i=l;i<=t[a];i++)
		if(val[i]) ret++;
	for(int i=s[b];i<=r;i++)
		if(val[i]) ret++;
//	cerr<<ret<<endl;
	for(int i=a+1;i<b;i++)
		ret+=sum[i];
	return ret;
}
2024/11/21 20:30
加载中...