mxqz制杖分块题 有关注作回报
查看原帖
mxqz制杖分块题 有关注作回报
363523
Enterpr1se楼主2021/8/12 15:39

rt……对着这代码愣了一小时了
评测状态:10pts(#2 AC,其余全部 WA)

//Luogu-P3870 
//Luogu @Enterpr1se (Userid 363523)
//@_Qijia (Userid 363524) AK IOI!
#include<cstdio>
#include<cstring>
#include<cmath>
#define regll register long long
#define regint register int
#define regshort register short
#define _Qijia using
#define AK namespace
#define IOI std
_Qijia AK IOI;
int n,m,a,b,c;
int min(int a,int b){
	return a<b?a:b;
}
struct block{
	int val,lzt;
};
struct Partition{
	block f[100005];
	int bls,blkno[100005],lsta[100005];
	Partition(){
		memset(lsta,0,sizeof(lsta));
	}
	void build(int r){
		bls=sqrt(r);
		for(regint i=1;i<=r/bls+1;++i) f[i]={0,0};
		for(regint i=1;i<=r;++i) blkno[i]=(i-1)/bls+1;
		return;
	}
	inline void update(int s,int e){
		int blk1end=min(blkno[s]*bls,e);
		for(regint i=s;i<=blk1end;++i)
			f[blkno[s]].val-=lsta[i]^f[blkno[s]].lzt,lsta[i]^=1,f[blkno[s]].val+=lsta[i]^f[blkno[s]].lzt;
		if(blkno[s]==blkno[e]) return;
		for(regint i=blkno[s]+1;i<blkno[e];++i)
			f[i].val=bls-f[i].val,f[i].lzt^=1;
		for(regint i=(blkno[e]-1)*bls+1;i<=e;++i)
			f[blkno[e]].val-=lsta[i]^f[blkno[e]].lzt,lsta[i]^=1,f[blkno[e]].val+=lsta[i]^f[blkno[e]].lzt;
		return;
	}
	inline int query(int s,int e){
		int ret=0,blk1end=min(blkno[s]*bls,e);
		for(regint i=s;i<=blk1end;++i)
			ret+=lsta[i]^f[blkno[s]].lzt;
		if(blkno[s]==blkno[e]) return ret;
		for(regint i=blkno[s]+1;i<blkno[e];++i)
			ret+=f[i].val;
		for(regint i=(blkno[e]-1)*bls+1;i<=e;++i) 
			ret+=lsta[i]^f[blkno[s]].lzt;
		return ret;
	}
} ptt;
signed main(){
	scanf("%d%d",&n,&m);
	ptt.build(n);
	while(m--){
		scanf("%d%d%d",&c,&a,&b);
		if(!c) ptt.update(a,b);
		else printf("%d\n",ptt.query(a,b));
	}
	return 0;
}
2021/8/12 15:39
加载中...