社区讨论

求助佬大

P3870[TJOI2009] 开关参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lznrqgtc
此快照首次捕获于
2024/08/10 14:42
2 年前
此快照最后确认于
2024/08/10 15:26
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define l(x) x<<1
#define r(x) x<<1|1
#define bar(x,y) x+y>>1
using namespace std;
int n,m;
struct sb{
	int v,i,l,r;
	bool add;
}c[1000086];
void bui(int p,int l,int r){
	c[p].l=l;
	c[p].r=r;
	c[p].v=0;
	if(l==r){
		return;
	}
	int mid=bar(l,r);
	bui(l(p),l,mid);
	bui(r(p),mid+1,r);
}
void spr(int p){
	if(c[p].add)
	{
		c[l(p)].v^=1;
		c[r(p)].v^=1;
		c[l(p)].add^=c[p].add;
		c[r(p)].add^=c[p].add;
		c[p].add = 0;
	}
}
void cha(int p,int l,int r){
	if(l>=c[p].l&&r<=c[p].r){
		c[p].v=(r-l+1)-c[p].v;
		c[p].add^=1;
		return;
	}
	spr(p);
	int mid=bar(l,r);
	if(l<=mid){
		cha(l(p),l,r);
	}
	if(r>mid){
		cha(r(p),l,r);
	}
}
int ask(int p,int l,int r){
	if(l<=c[p].l&&c[p].r<=r)return c[p].v;
	spr(p);
	int mid=bar(c[p].l, c[p].r),sum=c[p].v;
	if(l<=mid) sum+=ask(l(p),l,r);
	if(r>mid) sum+=ask(r(p),l,r);
	return sum;
}
int main(){
	cin>>n;
	bui(1,1,n);
	cin>>m;
	while(m--){
		int k,x,y;cin>>k>>x>>y;
		if(!k){
			cha(1,x,y);
		}
		else {
			cout<<ask(1,x,y)<<endl;
		}
	}
}

回复

0 条回复,欢迎继续交流。

正在加载回复...