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