社区讨论
求助,10pts,ac on #2
P3870[TJOI2009] 开关参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m3zkfd77
- 此快照首次捕获于
- 2024/11/27 15:29 去年
- 此快照最后确认于
- 2024/11/27 16:02 去年
CPP
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <queue>
#include <stack>
using namespace std;
#define maxn 200005
inline int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int n,m;
int a[maxn];
int k[2005];
int tag[2005];
int kcnt;
signed main(){
n=read();m=read();
kcnt=sqrt(n);
for(int i=0;i<n;++i) a[i]=0;
while(m){
m--;
int opt;
opt=read();
int wym1,wym2;
if(opt==0){
int l,r;
l=read();r=read();
l--;r--;
wym1=l/kcnt;wym2=r/kcnt;
if(wym1==wym2){
for(int i=l;i<=r;++i){
a[i]^=1;
if(a[i]==1){
++k[i/kcnt];
}
else{
--k[i/kcnt];
}
}
continue;
}//一个块内的修改
if(l%kcnt!=0){
for(int i=l;i<=(wym1+1)*kcnt-1;++i){
a[i]^=1;
if(a[i]==1){
++k[i/kcnt];
}
else{
--k[i/kcnt];
}
}
++wym1;
}
if((r+1)%kcnt!=0){
for(int i=wym2*kcnt;i<=r;++i){
a[i]^=1;
if(a[i]==1){
++k[i/kcnt];
}
else{
--k[i/kcnt];
}
}
--wym2;
}//单点的修改
for(int i=wym1;i<=wym2;++i){
k[i]=kcnt-k[i];//区间修改
tag[i]^=1;//单点修改
}
}
else{
int ans=0;
int l,r;l=read();r=read();l--;r--;
wym1=l/kcnt;wym2=r/kcnt;
if(wym1==wym2){
for(int i=l;i<=r;++i){
if(tag[i]==0) {if(a[i]==1) ++ans;}
else {if(a[i]==0) ++ans;}
}
cout<<ans<<endl;
continue;//一个区间内查询
}
if(l%kcnt!=0){
for(int i=l;i<=(wym1+1)*kcnt-1;++i){
if(tag[i]==0) {if(a[i]==1) ++ans;}
else {if(a[i]==0) ++ans;}
}
++wym1;
}
if((r+1)%kcnt!=0){
for(int i=wym2*kcnt;i<=r;++i){
if(tag[i]==0) {if(a[i]==1) ++ans;}
else {if(a[i]==0) ++ans;}
}
--wym2;
}//单点查询
for(int i=wym1;i<=wym2;++i){
ans+=k[i];
}//块的修改
cout<<ans<<endl;
}
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...