rt,第一份是我原来写的
#include <bits/stdc++.h>
using namespace std;
int n,m,l,r,op,bl,k;
int id[100005];
int a[100005],tag[100005],s[100005];
inline void update (int l,int r){
while (l%bl!=1&&l<=r){
s[id[l]]-=(a[l]^tag[id[l]]);
a[l]^=1;
s[id[l]]+=(a[l]^tag[id[l]]);
++l;
}
while (id[l]<id[r]){
s[id[l]]=bl-s[id[l]];
tag[id[l]]^=1;
l+=bl;
}
while (l<=r){
s[id[l]]-=(a[l]^tag[id[l]]);
a[l]^=1;
s[id[l]]+=(a[l]^tag[id[l]]);
++l;
}
}
inline int query (int l,int r){
int sum=0;
while (l%bl!=1&&l<=r){
sum+=(a[l]^tag[id[l]]);
++l;
}
while (id[l]<id[r]){
sum+=s[id[l]];
l+=bl;
}
while (l<=r){
sum+=(a[l]^tag[id[l]]);
++l;
}
return sum;
}
signed main(){
freopen ("lites.in","r",stdin);
freopen ("lites.out","w",stdout);
scanf ("%d%d",&n,&m);
bl=(int)(sqrt (n));
for (int i=1;i<=n;++i){
id[i]=(i-1)/bl+1;
}
for (int i=1;i<=m;++i){
scanf ("%d%d%d",&op,&l,&r);
if (op==0) update (l,r);
if (op==1) printf ("%d\n",query(l,r));
}
return 0;
}
AC了
下面是我现在写的:
#include <bits/stdc++.h>
using namespace std;
inline void in (int &x){
int f=1;x=0;char c=getchar();
while (c>'9'||c<'0'){if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9'){x=x*10+(c^48);c=getchar();}
x*=f;
}
int n,m,bl,l,r,op,tag[505],a[100005],sum[505],id[100005],L[505],R[505];
inline void update (int l,int r){
if (id[l]==id[r]){
for (int i=l;i<=r;++i){
sum[id[l]]-=a[i]^tag[id[l]];
a[i]^=1;sum[id[l]]+=a[i]^tag[id[l]];
}
return ;
}
for (int i=l;i<=R[id[l]];++i){
sum[id[l]]-=a[i]^tag[id[l]];
a[i]^=1;sum[id[l]]+=a[i]^tag[id[l]];
}
for (int i=r;i>=L[id[r]];--i){
sum[id[r]]-=a[i]^tag[id[r]];
a[i]^=1;sum[id[r]]+=a[i]^tag[id[r]];
}
for (int i=id[l]+1;i<=id[r]-1;++i){
sum[i]=bl-sum[i];tag[i]^=1;
}
}
inline int query (int l,int r){
int ans=0;
if (id[l]==id[r]){
for (int i=l;i<=r;++i)
ans+=a[i]^tag[id[l]];
return ans;
}
for (int i=l;i<=R[id[l]];++i)
ans+=a[i]^tag[id[l]];
for (int i=r;i>=L[id[r]];--i)
ans+=a[i]^tag[id[r]];
for (int i=id[l]+1;i<=id[r]-1;++i)
ans+=sum[i];
return ans;
}
signed main (){
freopen ("lites.in","r",stdin);
freopen ("lites.out","w",stdout);
in (n);in (m);
bl=(int) (sqrt (n));
for (int i=1;i<=n;++i){
id[i]=(i-1)/bl+1;
}
for (int i=1;i<=bl;++i){
L[i]=(i-1)*bl+1;
R[i]=i*bl;
}
L[id[n]]=(bl-1)*bl+1;R[id[n]]=n;
for (int i=1;i<=m;++i){
in (op);in (l);in (r);
if (op==0) update (l,r);
if (op==1) printf ("%d\n",query (l,r));
}
return 0;
}
没过测试点11
请问这两份代码的区别