社区讨论
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 条回复,欢迎继续交流。
正在加载回复...