关于这两份代码的区别
查看原帖
关于这两份代码的区别
366254
dxy2020楼主2022/9/25 23:08

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

请问这两份代码的区别

2022/9/25 23:08
加载中...