分块求助
查看原帖
分块求助
706523
AlicX楼主2023/5/20 15:20

越来越菜了。

线段树秒了,但是一打分块就废了。/kk

#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N=1e5+10;
int n,m;
int tag[N];
int a[N],b[N];
int id[N],len=0;
void modify(int l,int r){
	int lid=id[l],rid=id[r];
	if(lid==rid){
		for(int i=l;i<=r;i++){
			a[i]^=tag[lid],a[i]^=1; 
			if(!a[i]) b[lid]--; else b[lid]++;
		} return ;
	} for(int i=l;i<=len*lid;i++){
		a[i]^=tag[lid],a[i]^=1; 
		if(!a[i]) b[lid]--; else b[lid]++;
	} for(int i=len*(rid-1)+1;i<=r;i++){
		a[i]^=tag[rid],a[i]^=1;
		if(!a[i]) b[rid]--; else b[rid]++;
	} for(int i=lid+1;i<rid;i++) b[i]=len-b[i],tag[i]^=1;
}
int query(int l,int r){
	int lid=id[l],rid=id[r];
	if(lid==rid){
		int cnt=0;
		for(int i=l;i<=r;i++) a[i]^=tag[lid],cnt+=a[i]; return cnt;
	} int ans=0;
	for(int i=l;i<=len*lid;i++) a[i]^=tag[lid],ans+=a[i];
	for(int i=len*(rid-1)+1;i<=r;i++) a[i]^=tag[rid],ans+=a[i];
	for(int i=lid+1;i<rid;i++) ans+=b[i]; return ans;
}
signed main(){
	cin>>n>>m; len=sqrt(n);
	for(int i=1;i<=n;i++) id[i]=(i-1)/len+1;
	while(m--){
		int opt,l,r;
		cin>>opt>>l>>r;
		if(!opt) modify(l,r);
		else cout<<query(l,r)<<endl;
	}
	return 0;
}
2023/5/20 15:20
加载中...