社区讨论
分块0pts求条(关
P3870[TJOI2009] 开关参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mm1pgcgb
- 此快照首次捕获于
- 2026/02/25 15:20 2 周前
- 此快照最后确认于
- 2026/02/26 21:15 上周
CPP
#include<bits/stdc++.h>
using namespace std;
int m,n,bl,t;
bool lt[500001],add[800];
int head[800],tail[800];
int sum[800];
int cnt[500001];
int main(){
cin>>n>>m;
bl=sqrt(n);
t=n/bl;
if(n%bl)t++;
for(int i=1;i<=t;++i){
head[i]=(i-1)*bl+1;
tail[i]=i*bl;
}
tail[t]=n;
for(int i=1;i<=n;++i){
cnt[i]=(i-1)/bl;
}
// cout<<endl;
while(m--){
int a,b,c;
cin>>a>>b>>c;
if(a==0)
if(cnt[b]==cnt[c])
for(int i=b;i<=c;++i){
lt[i]=!lt[i];
if(lt[i])sum[cnt[i]]++;
else sum[cnt[i]]--;
}
else{
for(int i=cnt[b]+1;i<cnt[c];++i)
add[i]=!add[i];
for(int i=b;i<=tail[cnt[b]];++i){
lt[i]=!lt[i];
if(lt[i])sum[cnt[i]]++;
else sum[cnt[i]]--;
}
for(int i=head[cnt[c]];i<=c;++i){
lt[i]=!lt[i];
if(lt[i])sum[cnt[i]]++;
else sum[cnt[i]]--;
}
}
else{
int ans=0;
if(cnt[b]==cnt[c])
for(int i=b;i<=c;++i)
if(lt[i]==add[cnt[i]])
ans++;
else{
for(int i=cnt[b]+1;i<cnt[c];++i)
if(add[i])
ans+=bl-sum[i];
else
ans+=sum[i];
for(int i=b;i<=tail[cnt[b]];++i)
if(lt[i]==add[cnt[i]])
ans++;
for(int i=head[cnt[c]];i<=c;++i)
if(lt[i]==add[cnt[i]])
ans++;
}
cout<<ans<<'\n';
}
/* for(int i=1;i<=n;++i){
cout<<lt[i]<<' ';
}
cout<<endl;*/
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...