10pts分块求调
查看原帖
10pts分块求调
464732
luqyou楼主2022/12/15 21:56
#include<bits/stdc++.h>
using namespace std;
int n,m,a[100001],len,b[100001],id[100001],tag[100001];
int main(){
	scanf("%d%d",&n,&m);
	len=sqrt(n); 
	for(int i=1;i<=n;i++){
		id[i]=(i-1)/len+1;
	}
	for(int i=1;i<=m;i++){
		int op,x,y;
		scanf("%d%d%d",&op,&x,&y);
		switch(op){
			case 0:{
				int lid=id[x],rid=id[y];
				if(lid==rid){
					for(int i=x;i<=y;i++){
						if(a[i]) b[id[i]]--;
						else b[id[i]]++;
						a[i]^=1; 
					}
				}
				else{
					for(int i=x;id[i]==lid;i++){
						if(a[i]) b[id[i]]--;
						else b[id[i]]++;
						a[i]^=1;
					}
					for(int i=lid+1;i<rid;i++){
						tag[i]^=1;
						b[i]=len-b[i];
					}
					for(int i=y;id[i]==rid;i--){
						if(a[i]) b[id[i]]--;
						else b[id[i]]++;
						a[i]^=1;
					}
				}
				break;
			}
			case 1:{
				int lid=id[x],rid=id[y],ans=0;
				if(lid==rid){
					for(int i=x;i<=y;i++){
						if(a[i]^tag[id[i]]) ans++;
					}
				}
				else{
					for(int i=x;id[i]==lid;i++){
						if(a[i]^tag[id[i]]) ans++;
					}
					for(int i=lid+1;i<rid;i++){
						ans+=b[i];
					}
					for(int i=y;id[i]==rid;i--){
						if(a[i]^tag[id[i]]) ans++;
					}
				}
				printf("%d\n",ans);
				break;
			}
		}
	}
    return 0;
}
2022/12/15 21:56
加载中...