分块10pts 求调(玄关)
查看原帖
分块10pts 求调(玄关)
1273684
_std_O2楼主2024/10/19 16:12
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int L[N],R[N],pos[N],a[N],ans[N],tag[N],n,m,t;

void cg(int l,int r){
	int p=pos[l],q=pos[r];
	if(p==q){
		for(int i=l;i<=r;i++){
			ans[p]-=(a[i]^tag[p]);
			a[i]^=1;
			ans[p]+=(a[i]^tag[p]);
		}
	
	}
	else{
		for(int i=p+1;i<=q-1;i++){
			tag[i]^=1;
			ans[i]=(R[i]-L[i])-ans[i];
		}
		for(int i=l;i<=R[p];i++){
			ans[p]-=(a[i]^tag[p]);
			a[i]^=1;
			ans[p]+=(a[i]^tag[p]);
		}
		for(int i=L[q];i<=r;i++){
			ans[q]-=(a[i]^tag[q]);
			a[i]^=1;
			ans[q]+=(a[i]^tag[q]);
		}
		
	}
}

int ask(int l,int r){
	int  res=0;
	int p=pos[l],q=pos[r];
	if(p==q){
		for(int i=l;i<=r;i++){
			res+=(a[i]^tag[p]);
		}
	}
	else{
		for(int i=p+1;i<=q-1;i++)
			res+=ans[i];
		for(int i=l;i<=R[p];i++) 
			res+=(a[i]^tag[p]);
		for(int i=L[q];i<=r;i++) 
			res+=(a[i]^tag[q]);
	}
	return res;
}

signed main(){
	cin>>n>>m;
	int t=sqrt(n);
	for(int i=1;i<=t;i++){
		L[i]=(i-1) *sqrt(n)+1;
		R[i]=sqrt(n)*i;
	}
	if(R[t]<n){
		t++;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(int i=1;i<=t;i++){
		for(int j=L[i];j<=R[i];j++){
			pos[j]=i;
		}
	}
	for(int i=1;i<=m;i++){
		int op;
		cin>>op;
		if(op==0){
			int l,r,d;
			cin>>l>>r;
			cg(l,r);
		}
		if(op==1){
			int l,r;
			cin>>l>>r;
			cout<<ask(l,r)<<endl;
		}
	}
}
2024/10/19 16:12
加载中...