线段树10分求助,#2AC其他全WA
查看原帖
线段树10分求助,#2AC其他全WA
920861
shalu楼主2023/8/8 18:48

code


#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int MAXN=1e5+5;
int n,m,f[MAXN<<2],v[MAXN<<2];
void update(int k){
	f[k]=f[k+k]+f[k+k+1];
}
void pushdown(int k,int l,int r){
	if(v[k]==1){
		int mid=(l+r)>>1;
		v[k+k]^=1;
		v[k+k+1]^=1;
		f[k+k]=(mid-l+1)-f[k+k];
		f[k+k+1]=(r-mid)-f[k+k+1];
		v[k]=0;
	}
}
inline void insert(int k,int l,int r,int x,int y){
	if(l==x&&r==y){
		v[k]^=1;
		f[k]=(r-l+1)-f[k];
		return ;
	}
	pushdown(k,l,r);
	int mid=(l+r)>>1;
	if(y<=mid){
		insert(k+k,l,mid,x,y);
	}
	else{
		if(x>mid){
			insert(k+k+1,mid+1,r,x,y);
		}
		else{
			insert(k+k,l,mid,x,mid),insert(k+k+1,mid+1,r,mid+1,y);
		}
	}
	update(k);
}
int calc(int k,int l,int r,int x,int y){
	if(l==x&&r==y){
		return f[k];
	}
	pushdown(k,l,r);
	int mid=(l+r)>>1;
	if(y<=mid){
		return calc(k+k+1,l,mid,x,y);
	}
	else{
		if(x>mid){
			return calc(k+k+1,mid+1,r,x,y);
		}
		else{
			return calc(k+k,l,mid,x,mid)+calc(k+k+1,mid+1,r,mid+1,y);
		}
	}
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int op,x,y;
		cin>>op>>x>>y;
		if(op==0){
			insert(1,1,n,x,y);
		}
		else if(op==1){
			cout<<calc(1,1,n,x,y)<<endl;
		}
	}
	return 0;
} 
2023/8/8 18:48
加载中...