线段树10分求调
查看原帖
线段树10分求调
1404345
zzx20110203楼主2024/12/7 23:44
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
int n,m;
int a[maxn];
int sum[maxn*4];
int tap[maxn*4];
void down(int l,int r,int p){
	int mid=(l+r)>>1;
	if(tap[p]){
		sum[p*2]=(l-mid+1)-sum[p*2];
		tap[p*2]^=1;
		sum[p*2+1]=(r-mid)-sum[p*2+1];
		tap[p*2+1]^=1;
		tap[p]=0;
	}
	return ;
}
void xg(int cl,int cr,int l,int r,int p){
	if(cl<=l&&r<=cr){
		sum[p]=(r-l+1)-sum[p];
		tap[p]^=1;
		return ;
	}
	int mid=(l+r)>>1;
	down(l,r,p);
	if(cl<=mid){
		xg(cl,cr,l,mid,p*2);
	}
	if(mid<cr){
		xg(cl,cr,mid+1,r,p*2+1);
	}
	sum[p]=sum[p*2]+sum[p*2+1];
	return ;
}
int find(int cl,int cr,int l,int r,int p){
	int res=0;
	if(cl<=l&&r<=cr){
		return sum[p];
	}
	int mid=(l+r)>>1;
	down(l,r,p);
	if(cl<=mid){
		res+=find(cl,cr,l,mid,p*2);
	}
	if(mid<cr){
		res+=find(cl,cr,mid+1,r,p*2+1);
	}
	return res;
}
int main(){
	cin>>n>>m;
	while(m--){
		int qwq,a,b;
		cin>>qwq>>a>>b;
		if(!qwq){
			xg(a,b,1,n,1);
		}
		else{
			cout<<find(a,b,1,n,1)<<endl;
		}
	}
	return 0;
}

ac#2

已经翻了讨论区

调了2h

想死

2024/12/7 23:44
加载中...