求助大佬,WA最后一个点
查看原帖
求助大佬,WA最后一个点
169844
w2321楼主2021/2/1 21:39
#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;
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(){
	int 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,sum[i]+=a[j];
}
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[q]+=(a[i]^f[q]^1)-(a[i]^f[q]),a[i]^=1;
	for(ri i=p+1;i<q;++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;
}
2021/2/1 21:39
加载中...