分块10pts AC#2 求调
查看原帖
分块10pts AC#2 求调
999464
Jaxent楼主2025/7/24 10:02

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[500050],id[500050],f[500050],opt,l,r,c,v;
void add(int ll,int rr){
	int sid=id[ll],eid=id[rr];
	for(int i=ll;i<=min(sid*v,rr);i++){
		if(a[i]==0) a[i]=1;
		else a[i]=0;
	}
	if(sid!=eid)
		for(int i=(eid-1)*v+1;i<=rr;i++){
			if(a[i]==0) a[i]=1;
			else a[i]=0;
		}
	for(int i=sid+1;i<=eid-1;i++) f[i]=v-f[i];
	return;
}
int fi(int ll,int rr,int num){
	int sid=id[ll],eid=id[rr];
	for(int i=ll;i<=min(rr,sid*v);i++) if(a[i]==1) num++;
	if(sid!=eid) for(int i=(eid-1)*v+1;i<=rr;i++) if(a[i]==1) num++;
	for(int i=sid+1;i<=eid-1;i++) num+=f[i];
	return num;
}
signed main(){
	cin>>n>>m;
	v=sqrt(n);
	for(int i=1;i<=n;i++) a[i]=0;
	for(int i=1;i<=n;i++){
		id[i]=(i-1)/v+1;
	}
	for(int i=1;i<=m;i++){
		cin>>opt>>l>>r;
		if(opt==0) add(l,r);
		else cout<<fi(l,r,0)<<endl;
	}
	return 0;
}

2025/7/24 10:02
加载中...