分块10分求调
查看原帖
分块10分求调
542199
dxt_楼主2023/11/10 13:54
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a[N],l[N],r[N],pos[N],sum[N],lazy[N];
int t,p,n,m;
char f;
void update(int x,int y){
	int p=pos[x],q=pos[y];
	if(p==q){
		for(int i=x;i<=y;++i){
			if(a[i]==0) sum[p]++,a[i]=1;
			else a[i]=0,sum[p]--;
		}
		return;
	}
	
	for(int i=p+1;i<=q-1;++i) lazy[i]++;
	for(int i=x;i<=r[p];++i){
			if(a[i]==0) sum[p]++,a[i]=1;
			else a[i]=0,sum[p]--;
		}
	for(int i=l[q];i<=y;++i){
			if(a[i]==0) sum[q]++,a[i]=1;
			else a[i]=0,sum[q]--;
		}
	return;
}
int search(int x,int y){
	int p=pos[x],q=pos[y];
	int ans=0;
	if(p==q){
		for(int i=x;i<=y;++i) ans+=(a[i]+lazy[i])%2;
		return ans;
	}
	for(int i=x;i<=r[p];++i) ans+=(a[i]+lazy[i])%2;
	for(int i=l[q];i<=y;++i) ans+=(a[i]+lazy[i])%2;
	for(int i=p+1;i<=q-1;++i) 
	lazy[i]%2==0?ans+=sum[i]:ans+=r[i]-l[i]+1-sum[i];
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	t=sqrt(n);
	for(int i=1;i<=t;++i){
	l[i]=t*(i-1)+1,r[i]=t*i;
	for(int j=l[i];j<=r[i];++j) pos[j]=i;
	}
	if(r[t]<n){
	l[1+t]=r[t]+1,r[t+1]=n,t+=1;
	for(int j=l[t];j<=r[t];++j) pos[j]=t;
	}
	while(m--){
		cin>>f;
		int x,y;
		int k;scanf("%d%d",&x,&y);
		if(f=='0')update(x,y);
		else printf("%d\n",search(x,y));
	}
	return 0;
} 
2023/11/10 13:54
加载中...