分块10pts求调qwq(卡了三次了
查看原帖
分块10pts求调qwq(卡了三次了
755242
creepaid_awa楼主2023/8/21 16:28

只对了第二个点qwq

#include<bits/stdc++.h>
using namespace std;
const int inf=1e5+7;

int n,m,block,t,op,l,r;
bool a[inf],tag[1145];
int st[1145],ed[1145];
int id[inf],sum[1145];

void remake(int n){
	block=sqrt(n);
	t=n/block;
	if(n%block)++t;
	for(int i=1;i<=t;++i){
		st[i]=(i-1)*block+1;
		ed[i]=i*block;
	}ed[t]=n;
	for(int i=1;i<=n;++i){
		id[i]=(i-1)/block+1;
	}
}

void add(int l,int r){
	int p=id[l],q=id[r];
	if(p==q){
		for(;l<=r;++l){
			sum[p]-=a[l];
			a[l]^=1;
			sum[p]+=a[l];
		}
	}
	else{
		for(;l<=ed[p];++l){
			sum[p]-=a[l];
			a[l]^=1;
			sum[p]+=a[l];
		}
		for(;r>=st[q];--r){
			sum[q]-=a[r];
			a[r]^=1;
			sum[q]+=a[r];
		}
		++p,--q;
		for(;p<=q;++p){
			sum[p]=block-sum[p];
			tag[p]^=1;
		}
	}
}

int query(int l,int r){
	int p=id[l],q=id[r],rt=0;
	if(p==q){
		for(;l<=r;++l)
			rt+=a[l]^tag[p];
	}
	else{
		for(;l<=ed[p];++l)
			rt+=a[l]^tag[p];
		for(;r>=st[q];--r)
			rt+=a[r]^tag[q];
		++p,--q;
		for(;p<=q;++p)
			rt+=sum[p];
	}
	return rt;
}

int main(){
	ios::sync_with_stdio(0);
	cin>>n>>m;
	remake(n);
	while(m--){
		cin>>op>>l>>r;
		if(op==0){
			add(l,r);
		}
		else if(op==1){
			cout<<query(l,r)<<endl;
		}
	}
	return 0;
}
2023/8/21 16:28
加载中...