P3870 100分WA求助
查看原帖
P3870 100分WA求助
389797
Nemonade楼主2022/5/23 16:52

RT,分块,hack数据不过,拍了5000组了,救救孩子。

#include<bits/stdc++.h>
using namespace std;
//#define int long long
#define pfor(i,x,y) for(register int i=x;i<=y;++i)
#define mfor(i,x,y) for(register int i=x;i>=y;--i)
constexpr inline int maxx(const int &x,const int &y){return x>y?x:y;}
constexpr inline int minx(const int &x,const int &y){return x<y?x:y;}
constexpr inline int absx(const int &x){return (x>0)?(x):(~x+1);}
inline int read(){
	int x=0;bool flag=false;char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') flag=true;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return flag?~x+1:x;
}
inline void write(int x){
	if(x<0){putchar('-');x=(~x+1);}
	if(x/10) write(x/10);
	putchar((x%10)^48);
	return;
}
const int N=1e5+5;
const int M=5e2+5;
int n,a[N],blen,bcnt,bl[M],br[M],bid[N],bdata[M][2],blazy[M];
int opt,x,y;
inline void binit(){
	blen=sqrt(n),bcnt=n/blen;
	pfor(i,1,bcnt) bl[i]=br[i-1]+1,br[i]=i*blen;
	if(br[bcnt]!=n) bl[++bcnt]=br[bcnt-1]+1,br[bcnt]=n;
	pfor(i,1,bcnt) bdata[i][0]=br[i]-bl[i]+1;
	pfor(i,1,bcnt) pfor(j,bl[i],br[i]) bid[j]=i;
	return;
}
inline void change(int l,int r){
	if(bid[l]==bid[r]){
		if(blazy[bid[l]]) pfor(i,bl[bid[l]],br[bid[r]]) a[i]=1-a[i];
		blazy[bid[l]]=0;
		pfor(i,l,r) a[i]=1-a[i];
		bdata[bid[l]][0]=bdata[bid[l]][1]=0;
		pfor(i,bl[bid[l]],br[bid[r]]) bdata[bid[l]][1]+=a[i],bdata[bid[l]][0]+=1-a[i];
		return;
	}
	if(blazy[bid[l]]) pfor(i,bl[bid[l]],br[bid[l]]) a[i]=1-a[i];
	blazy[bid[l]]=0;
	pfor(i,l,br[bid[l]]) a[i]=1-a[i];
	bdata[bid[l]][0]=bdata[bid[l]][1]=0;
	pfor(i,bl[bid[l]],br[bid[l]]) bdata[bid[l]][1]+=a[i],bdata[bid[l]][0]+=1-a[i];
	
	if(blazy[bid[r]]) pfor(i,bl[bid[r]],br[bid[r]]) a[i]=1-a[i];
	blazy[bid[r]]=0;
	pfor(i,bl[bid[r]],r) a[i]=1-a[i]; 
	bdata[bid[r]][0]=bdata[bid[r]][1]=0;
	pfor(i,bl[bid[r]],br[bid[r]]) bdata[bid[r]][1]+=a[i],bdata[bid[r]][0]+=1-a[i];
	
	pfor(i,bid[l]+1,bid[r]-1) blazy[i]=1-blazy[i];
	return;
}
inline int ask(int l,int r){
	int res=0;
	if(bid[l]==bid[r]){
		pfor(i,l,r) res+=(((blazy[bid[i]])?(1-a[i]):a[i]));
		return res;
	}
	pfor(i,l,br[bid[l]]) res+=(((blazy[bid[i]])?(1-a[i]):a[i]));
	pfor(i,bl[bid[r]],r) res+=(((blazy[bid[i]])?(1-a[i]):a[i]));
	pfor(i,bid[l]+1,bid[r]-1) res+=bdata[i][1-blazy[i]];
	return res;
}
inline void print(){
	printf(" a[]=");
	pfor(i,1,n) printf("%d,",a[i]);puts("");
	pfor(i,1,bcnt)
		printf(" id=%d,l=%d,r=%d,data=[%d,%d],lazy=%d\n",
		i,bl[i],br[i],bdata[i][0],bdata[i][1],blazy[i]);
}
signed main(){
	n=read();int kkk=read();
	binit();
//	print();
	while(kkk--){
		opt=read(),x=read(),y=read();
		if(opt==0) change(x,y);
		else write(ask(x,y)),puts("");
//		print();
	}
	return 0;
}
2022/5/23 16:52
加载中...