BZOJ 1230: [Usaco2008 Nov]lites 开关灯

线段树裸题

#include<cstdio>
#include<algorithm>
using namespace std;
int n,q,sz0[1000005],sz1[1000005],rev[1000005];
void update(int t){
	sz0[t]=sz0[t<<1]+sz0[t<<1|1];
	sz1[t]=sz1[t<<1]+sz1[t<<1|1];
}
void push_down(int t){
	rev[t<<1]^=1,rev[t<<1|1]^=1;
	swap(sz0[t<<1],sz1[t<<1]),swap(sz0[t<<1|1],sz1[t<<1|1]);
	rev[t]^=1;
}
void modify_rev(int t,int l,int r,int x,int y){
	if (r<x || l>y) return;
	if (l>=x && r<=y){
		rev[t]^=1;
		swap(sz0[t],sz1[t]);
		return;
	}
	if (rev[t]) push_down(t);
	int mid=(l+r)>>1;
	modify_rev(t<<1,l,mid,x,y);
	modify_rev(t<<1|1,mid+1,r,x,y);
	update(t);
}
int query(int t,int l,int r,int x,int y){
	if (r<x || l>y) return 0;
	if (l>=x && r<=y) return sz1[t];
	if (rev[t]) push_down(t);
	int mid=(l+r)>>1;
	return query(t<<1,l,mid,x,y)+query(t<<1|1,mid+1,r,x,y);
}
void build(int t,int l,int r){
	if (l==r){
		sz0[t]=1;
		return;
	}
	int mid=(l+r)>>1;
	build(t<<1,l,mid);
	build(t<<1|1,mid+1,r);
	update(t);
}
int main(){
	scanf("%d%d",&n,&q);
	build(1,1,n);
	while (q--){
		int cas,l,r;
		scanf("%d%d%d",&cas,&l,&r);
		if (!cas) modify_rev(1,1,n,l,r);
		else printf("%d\n",query(1,1,n,l,r));
	}
	return 0;
}

  

posted @ 2018-11-03 14:44  ~Silent  阅读(96)  评论(0编辑  收藏  举报
Live2D