P3870 [TJOI2009]开关
注意
void block(){
t=sqrt(n);
for(ri i=1;i<=t;++i)
l[i]=(i-1)*t+1,r[i]=i*t;
if(r[t]<n) l[++t]=r[t-1]+1,r[t]=n;
for(ri i=1;i<=t;++i)
for(ri j=l[i];j<=r[i];++j)
b[j]=i;
}
void block(){
t=sqrt(n);
for(ri i=1;i<=n;++i) b[i]=(i-1)/t+1;
for(ri i=1;i<=b[n];++i)
l[i]=(i-1)*t+1,r[i]=i*t;
r[b[n]]=min(r[b[n]],n);
}
代码
#include<cstdio>
#include<iostream>
#include<cmath>
#define ri register int
using namespace std;
const int maxn=1e5+9;
int sum[maxn],f[maxn];
int l[maxn],r[maxn];
int a[maxn],b[maxn];
int n,m,tot,sq;
inline int read(){
int x=0,f1=0;char c=getchar();
while(c>'9'||c<'0') f1=c=='-',c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
return f1?-x:x;
}
void block(){
sq=sqrt(n);
for(ri i=1;i<=n;++i) b[i]=(i-1)/sq+1;
for(ri i=1;i<=b[n];++i)
l[i]=(i-1)*sq+1,r[i]=i*sq;
r[b[n]]=min(r[b[n]],n);
}
void change(int x,int y){
int p=b[x],q=b[y];
for(ri i=x;i<=min(y,r[p]);++i)
sum[p]+=(a[i]^f[p]^1)-(a[i]^f[p]),a[i]^=1;
if(p!=q)
for(ri i=l[q];i<=y;++i)
sum[p]+=(a[i]^f[p]^1)-(a[i]^f[p]),a[i]^=1;
for(ri i=p+1;i<=q-1;++i)
sum[i]=r[i]-l[i]+1-sum[i],f[i]^=1;
}
void query(int x,int y){
int p=b[x],q=b[y],ans=0;
for(ri i=x;i<=min(y,r[p]);++i) ans+=(a[i]^f[p]);
if(p!=q) for(ri i=l[q];i<=y;++i) ans+=(a[i]^f[q]);
for(ri i=p+1;i<q;++i) ans+=sum[i];
printf("%d\n",ans);
}
int main(){
n=read(),m=read();
block();
while(m--)
{
int op=read(),x=read(),y=read();
if(!op) change(x,y);
if(op) query(x,y);
}
return 0;
}