#2AC其余WA,看过讨论,求调
查看原帖
#2AC其余WA,看过讨论,求调
439165
小涛涛??楼主2024/8/13 16:05

代码如下

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lc 2*k
#define rc 2*k+1
//#define mid (l+r)/2
const int maxn=1e5+10;
int tre[maxn*4],laz[maxn*4],tmp[maxn];
//void b_tre(int k,int l,int r)
//{
//	if(l>=r)
//	{
//		tre[k]=tmp[r];
//		return ;
//	}
//	int mid=(l+r)/2;
//	b_tre(lc,l,mid);
//	b_tre(rc,mid+1,r);
//	tre[k]=tre[lc]+tre[rc];
//	return ;
//}
void laz_d(int k,int l,int r) {
	if(laz[k]) {
		tre[k]=(r-l+1-tre[k]);
		if(l!=r) {
			laz[lc]^=1;
			laz[rc]^=1;
		}
		laz[k]=0;
	}

	return ;
}
void ans_u(int k,int l,int r) {
	int mid=(l+r)/2;
	laz_d(lc,l,mid);
	laz_d(rc,mid+1,r);
	tre[k]=tre[lc]+tre[rc];
	return ;
}
void change(int k,int l,int r,int al,int ar) {
	if(al<=l&&ar>=r) {
		laz[k]^=1;
		return ;
	}
	laz_d(k,l,r);
	int mid=(l+r)/2;
	if(ar>mid)
		change(rc,mid+1,r,al,ar);
	if(al<=mid)
		change(lc,l,mid,al,ar);
	ans_u(k,l,r);
}
int get(int k,int l,int r,int al,int ar) {
	if(al<=l&&ar>=r) {
		if(laz[k]) {
			tre[k]=(r-l+1-tre[k]);
			laz[k]=0;
		}
		return tre[k];
	}
	if(laz[k])laz_d(k,l,r);
	int mid=(r+l)/2,sum=0;
	if(al<=mid)
		sum+=get(lc,l,mid,al,ar);
	if(ar>mid)
		sum+=get(rc,mid+1,r,al,ar);
	return sum;
}
signed main() {
	int n,m;
	cin>>n>>m;
//	b_tre(1,1,n);
	memset(laz,0,sizeof(laz));
	int k,l,r,o;
	for(int i=1; i<=m; i++) {
		cin>>o>>l>>r;
		if(o==0) {
			change(1,1,n,l,r);
		} else if(o==1) {
			cout<<get(1,1,n,l,r)<<"\n";
		}
	}

	return 0;
}
2024/8/13 16:05
加载中...