分块10pts求调 初始化啥的都整了
查看原帖
分块10pts求调 初始化啥的都整了
261417
asasas楼主2025/8/5 17:17
#include <bits/stdc++.h>
using namespace std;
int be[500005],a[500005],sum[500005],L[500005],R[500005],tag[500005];
int n,m,t;
int getsum(int l,int r){
	if (be[l]==be[r]){
		int ans=0;
		for (register int i=l;i<=r;i++) ans+=a[i]^tag[be[l]];
		return ans;
	}
	int ans=0;
	for (register int i=l;i<=R[be[l]];i++) ans+=a[i]^tag[be[l]];
	for (register int i=be[l]+1;i<=be[r]-1;i++) ans+=sum[i];
	for (register int i=L[be[r]];i<=r;i++) ans+=a[i]^tag[be[r]];
	return ans;
}
void change(int l,int r){
	if (be[l]==be[r]){
	   for (register int i=l;i<=r;i++){
			sum[i]-=a[i]^tag[be[l]];
			a[i]^=1;
			sum[i]+=a[i]^tag[be[l]];
		}
		return ;
	}
	for (register int i=l;i<=R[be[l]];i++){
		sum[i]-=a[i]^tag[be[l]];
		a[i]^=1;
		sum[i]+=a[i]^tag[be[l]];
	}
	for (register int i=be[l]+1;i<=be[r]-1;i++) tag[i]^=1,sum[i]=(R[i]-L[i]+1)-sum[i];
	for (register int i=L[be[r]];i<=r;i++){
		sum[i]-=a[i]^tag[be[r]];
		a[i]^=1;
		sum[i]+=a[i]^tag[be[r]];
	}
}
int main(){
	cin >> n >> m;
	t=sqrt(n);
	int len=n/t;
	for (register int i=1;i<=t;i++){
		L[i]=(i-1)*len+1;
		R[i]=i*len;
//		cout << L[i] << ' ' << R[i] << endl;
	}	
	if (t*t!=n) t++,L[t]=R[t-1]+1,R[t]=n;
	for (register int i=1;i<=t;i++){
		for (register int j=L[i];j<=R[i];j++) be[j]=i,tag[i]=1;
	}
	while(m--){
		int op;
		cin >> op;
		if (op==0){
			int l,r;
			cin >> l >> r;
			change(l,r);
		} 
		if (op==1){
			int l,r;
			cin >> l >> r;
			cout << getsum(l,r) << endl;
		}
	}
}
2025/8/5 17:17
加载中...