爆零求助
查看原帖
爆零求助
52381
CodingJellyfish楼主2021/1/27 09:54
#include <stdio.h>
enum{M=100001};
int tree[M*4],lazy[M*4],n;
void update(int l, int r, int i, int curl, int curr) {
	if(curl >= l && curr <= r) {
		tree[i]=curr-curl+1-tree[i];
		lazy[i]^=1;
		return;
	}
	if(curl<r||curr>l)return;
	if(lazy[i]) {
		lazy[i<<1]^=lazy[i];
		lazy[(i<<1)+1]^=lazy[i];
		tree[i<<1]=curr-curl+1-tree[(i<<1)];
		tree[(i<<1)+1]=curr-curl+1-tree[(i<<1)+1];
		lazy[i]=0;
	}
	int mid=(curl+curr)>>1;
	if(l<=mid)update(l,r,i<<1,curl,mid);
	if(r>mid)update(l,r,(i<<1)+1,mid+1,curr);
	tree[i]=tree[i<<1]+tree[(i<<1)+1];
}
int get(int l, int r, int i, int curl, int curr) {
	if(curl >= l && curr <= r) {
		return tree[i];
	}
	if(curl<r||curr>l)return 0;
	if(lazy[i]) {
		lazy[i<<1]^=lazy[i];
		lazy[(i<<1)+1]^=lazy[i];
		tree[i<<1]=curr-curl+1-tree[(i<<1)];
		tree[(i<<1)+1]=curr-curl+1-tree[(i<<1)+1];
		lazy[i]=0;
	}
	int mid=(curl+curr)>>1,ret=0;
	if(l<=mid)ret += get(l,r,i<<1,curl,mid);
	if(r>mid)ret += get(l,r,(i<<1)+1,mid+1,curr);
	return ret;
}
int main() {
	int m,a,b,c,i;
	scanf("%d%d", &n, &m);
	for(i = 1; i <= m; i ++) {
		scanf("%d%d%d", &a, &b, &c);
		if(a==1) {
			printf("%d\n",get(b,c,1,1,n));
		}
		else {
			update(b,c,1,1,n);
		}
	}
	return 0;
}
'''
2021/1/27 09:54
加载中...