社区讨论

只有第二个点过了,求调

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@m1sni4hw
此快照首次捕获于
2024/10/03 10:02
去年
此快照最后确认于
2025/11/04 18:15
4 个月前
查看原帖

rt

CPP
#include <bits/stdc++.h>
using namespace std;
int n,q,tree[300005],t[300005];
void push_down(int k,int l,int r){
	int mid=(l+r)>>1;
	if(t[k]%2!=0){
		tree[k*2]=(mid-l+1)-tree[k*2],t[k*2]+=1;
		tree[k*2+1]=(r-mid)-tree[k*2+1],t[k*2+1]+=1; 
	}
	t[k]=0;
}
void change(int k,int x,int y,int a,int b){
	if(x>=a && y<=b){
		t[k]+=1;
	 	tree[k]=(y-x+1)-tree[k];
	 	//cout<<t[k]<<' '<<x<<' '<<y<<' '<<tree[k]<<endl;
	 	return ;
	}
	int mid=(x+y)>>1;
	push_down(k,x,y); 
	if(a<=mid) change(k*2,x,mid,a,b);
	if(b>mid) change(k*2+1,mid+1,y,a,b);
	tree[x]=tree[x*2]+tree[x*2+1];
}
int merge(int k,int x,int y,int a,int b){
	if(x>=a && y<=b){
		//cout<<x<<' '<<y<<' '<<tree[k]<<endl;
		return tree[k];
	}
	int mid=(x+y)>>1;
	push_down(k,x,y);
	int res=0;
	if(a<=mid) res+=merge(k*2,x,mid,a,b);
	if(b>mid) res+=merge(k*2+1,mid+1,y,a,b);
	return res;
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=q;i++){
		int t,a,b;
		scanf("%d%d%d",&t,&a,&b);
		if(t==0){
			change(1,1,n,a,b);
		}else{
			printf("%d\n",merge(1,1,n,a,b));
		}
	}
	return 0;
} 

回复

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

正在加载回复...