分块10分WA了,求助
查看原帖
分块10分WA了,求助
263333
HuAnGwEnJiEx楼主2021/3/7 18:03
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#define int long long
using namespace std;
const long long N=1e5+10;
long long a[N],L[N],R[N],pos[N],sum[N],tag[N],n,m,len,num;
void change(int l,int r)
{
	int lx=pos[l],rx=pos[r];
	if(lx==rx)
	{
		for(int i=l;i<=r;i++)
		{
			a[i]^=1;
			if(a[i]==0) sum[lx]--;
			else sum[lx]++;
		}
	}
	else {
		for(int i=l;i<=R[lx];i++) {
		a[i]^=1;
		if(a[i]==0) sum[lx]--;
		else sum[lx]++;
		}
		for(int i=lx+1;i<=rx-1;i++){
			tag[i]^=1;
			sum[i]=len-sum[i];
	    }
	    for(int i=L[rx];i<=r;i++) {
		a[i]^=1;
		if(a[i]==0) sum[rx]--;
		else sum[rx]++;
		}
	}
}
int ask(int l,int r)
{
	int lx=pos[l],rx=pos[r];
	if(lx==rx)
	{
		int ans=0;
		for(int i=l;i<=r;i++)
			ans+=a[i]^tag[lx];
		return ans;
	}
	else {
		int ans=0;
		for(int i=l;i<=R[lx];i++)
			ans+=a[i]^tag[lx];
		for(int i=lx+1;i<=rx-1;i++) ans+=sum[i];
		for(int i=L[rx];i<=r;i++)
			ans+=a[i]^tag[rx];
		return ans;
	}
}
signed main()
{
	cin>>n>>m;
	len=sqrt(n);
	num=ceil(n*1.0/len);
	for(int i=1;i<=num;i++)
	{
		L[i]=(i-1)*len+1;
		R[i]=i*len;
	}
	for(int i=1;i<=n;i++)
	{
		pos[i]=(i-1)/len+1;
	}	
	while(m--)
	{
		int opt,l,r;
		cin>>opt>>l>>r;
		if(opt==0) change(l,r);
		else cout<<ask(l,r)<<endl;
	}
	return 0;
}
2021/3/7 18:03
加载中...