社区讨论

10分wa求调只过了#2 悬关

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhjrlosj
此快照首次捕获于
2025/11/04 07:22
4 个月前
此快照最后确认于
2025/11/04 07:22
4 个月前
查看原帖
RT
CPP
#include<bits/stdc++.h>
#define int long long
const int N=1e5;
using namespace std;
int tree[N<<5],lazy[N<<5];
int n,m;
int c,a,b;
void push_up(int rt)
{
	tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
void push_down(int l,int r,int rt)
{
	if(lazy[rt])
	{
		lazy[rt<<1]^=1;
		lazy[rt<<1|1]^=1;
		
		tree[rt<<1]=l-tree[rt<<1];
		tree[rt<<1|1]=r-tree[rt<<1|1];
		lazy[rt]=0;
	}
}
void builu(int l,int r,int rt)
{
	if(l==r)
	{
		tree[rt]=0;
		return ;
	}
	int mid=(l+r)>>1;
	builu(l,mid,rt<<1);
	builu(mid+1,r,rt<<1|1);
	push_up(rt);
}
void up(int L,int R,int l,int r,int rt)
{
	if(L<=l&&r<=R)
	{
		tree[rt]=(r-l+1)-tree[rt];
		lazy[rt]^=1;
		return ;
	}
	int mid=(l+r)>>1;
	push_down(mid-l+1,r-mid,rt);
	if(L<=mid) up(L,R,l,mid,rt<<1);
	if(R>mid) up(L,R,mid+1,r,rt<<1|1);
	push_up(rt);
}
int query(int L,int R,int l,int r,int rt)
{
	if (L<=l&&r<=R)
	{
		return tree[rt];
	}
	int mid=(l+r)>>1,ans=0;
	push_down(mid-l+1,r-mid,rt);
	if(L<=mid) ans+=query(L,R,l,mid,rt<<1);
	if(R>mid) ans+=query(L,R,mid+1,r,rt<<1|1);
	return ans;
	
}
signed main()
{
	std::ios::sync_with_stdio();
	cout.tie(0);cin.tie(0);
	cin>>n>>m;
	builu(1,n,0);
	for(int i=1;i<=m;i++)
	{
		cin>>c>>a>>b;
		if(c==0)
		{
			up(1,n,a,b,0);
		}
		if(c==1)
		{
			cout<<query(1,n,a,b,0)<<"\n";
		}
	}
	
	
	
	return 0;
} 

回复

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

正在加载回复...