XOR的艺术--线段树

版权声明:转载请附上地址 https://blog.csdn.net/weixin_44574520/article/details/89785956

luogu 2574

在这里插入图片描述

Code:

#include <bits/stdc++.h>
using namespace std;
#define maxn 200010
#define maxm 200010
#define mid ((l+r)>>1)
#define lson l,mid,nod<<1
#define rson mid+1,r,nod<<1|1

int n,m,a[maxn],tree[maxn<<2],lazy[maxn<<2];
char s[maxn];

inline void xiugai_(int l,int r,int nod) {
	tree[nod]=(r-l+1)-tree[nod];
	lazy[nod]^=1;
}

inline void pushdown_(int l,int r,int nod) {
	if(!lazy[nod]) return;
	xiugai_(lson);xiugai_(rson);
	lazy[nod]=0;
}

inline void pushup_(int nod) {
	tree[nod]=tree[nod<<1]+tree[nod<<1|1];
}

inline void build_(int l,int r,int nod) {
	if(l==r) {
		tree[nod]=a[l];
		return;
	}
	build_(lson);
	build_(rson);
	pushup_(nod);
}

inline void update_(int l,int r,int nod,int LL,int RR) {
	if(LL<=l&&RR>=r) {
		xiugai_(l,r,nod);
		return;
	}
	pushdown_(l,r,nod);
	if(LL<=mid) update_(lson,LL,RR);
	if(RR>mid) update_(rson,LL,RR);
	pushup_(nod);
}

inline int query_(int l,int r,int nod,int LL,int RR) {
	if(LL<=l&&RR>=r) return tree[nod];
	pushdown_(l,r,nod);
	int ans=0;
	if(LL<=mid) ans+=query_(lson,LL,RR);
	if(RR>mid) ans+=query_(rson,LL,RR);
	return ans;
} 

inline void init_() {
	freopen("a.txt","r",stdin);
}

inline int read_() {
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

inline void clean_() {
	memset(lazy,0,sizeof(lazy));
	memset(tree,0,sizeof(tree));
}
inline void readda_() {
	clean_();
	n=read_();m=read_();
	scanf("%s",s);
	for(int i=1;i<=n;i++) a[i]=s[i-1]-'0';
	build_(1,n,1);
	int p,x,y;
	for(int i=1;i<=m;i++) {
		p=read_();x=read_();y=read_();
		if(p==0) {
			update_(1,n,1,x,y);
		}
		else if(p==1) {
			printf("%d\n",query_(1,n,1,x,y));
		}
	}
}

int main() {
	init_();
	readda_();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44574520/article/details/89785956