分块10pts求调
查看原帖
分块10pts求调
737158
yszkddzyh楼主2023/1/20 12:59

按照第一篇题解思路打的代码。

提交记录

#include <iostream>
#include <cmath>
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int const maxn=1e5+1,maxsqrtn=319;
bool a[maxn];
int block[maxn],sum[maxsqrtn],n,m,f,x,y,len;
void change(int l,int r){
	for(int i=l;i<=Min(block[l]*len,r);i++)
		a[i]^=1,sum[block[i]]+=(a[i]?1:-1);
	if(block[l]!=block[r]){
		for(int i=(block[r]-1)*len+1;i<=r;i++)
			a[i]^=1,sum[block[i]]+=(a[i]?1:-1);
	}
	for(int i=block[l]+1;i<block[r];i++)
		sum[i]=len-sum[i];
}
int sch(int l,int r){
	int s=0;
	for(int i=l;i<=Min(block[l]*len,r);i++)
		s+=a[i];
	if(block[l]!=block[r]){
		for(int i=(block[r]-1)*len+1;i<=r;i++)
			s+=a[i];
	}
	for(int i=block[l]+1;i<block[r];i++)
		s+=sum[i];
	return s;
}
int main(){
	scanf("%d%d",&n,&m),len=sqrt(n);
	for(int i=1;i<=n;i++) block[i]=ceil(1.0*i/len);
	while(m--){
		scanf("%d%d%d",&f,&x,&y);
		if(f) printf("%d\n",sch(x,y));
		else change(x,y);
	}
	return 0;
}
2023/1/20 12:59
加载中...