捞
查看原帖
捞
767295
hfjqwq楼主2024/5/15 18:08

求调:

线段树,区间异或,求区间加。 出现了点未知错。

#include<bits/stdc++.h>
#define int long long
#define mid ((l+r)/2)
#define ls(x) (2*x)
#define rs(x) (2*x+1)
const int N=1e5+10;
using namespace std;
int n,m,tr[4*N],lzy[4*N];
void pushup(int u){
	tr[u]=tr[ls(u)]+tr[rs(u)];
}
void maketag(int u,int l,int r){
	int len=r-l+1;
	tr[u]=(len-tr[u]);
	lzy[u]^=1;
}
void pushdown(int u,int l,int r){
	if(!lzy[u]) return;
	maketag(ls(u),l,mid);
	maketag(rs(u),mid+1,r);
	lzy[u]=0;
}
void update(int u,int l,int r,int L,int R){
	if(l>=L&&r<=R){
		maketag(u,l,r);
		return;
	}else if(r<L||l>R){
		pushdown(u,l,r);
		update(ls(u),l,mid,L,R);
		update(rs(u),mid+1,r,L,R);
		pushup(u);
	}
}
int ask(int u,int l,int r,int L,int R){
	if(l>=L&&r<=R){
		return tr[u];
	}else if(r<L||l>R){
		pushdown(u,l,r);
		return ask(ls(u),l,mid,L,R)+ask(rs(u),mid+1,r,L,R);
	}
}
signed main(){
	cin>>n>>m;
	while(m--){
		int op,l,r;
		cin>>op>>l>>r;
		if(!op){
			update(1,1,n,l,r);
		}else{
			cout<<ask(1,1,n,l,r)<<"\n";
		}
	}
    return 0;
}
2024/5/15 18:08
加载中...