分块10分马蜂优良AC#2求条玄关感谢捏~
查看原帖
分块10分马蜂优良AC#2求条玄关感谢捏~
989997
DGL__DGL_AFO楼主2024/7/23 09:25
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int op,l,r;
ll a[114514],b[1145];
ll sum[1145],add[1145];
ll n,m;
ll c;
ll lp,rp;
ll ans;

inline void change(int l,int r)
{
	//cout<<l<<' '<<r<<endl;
	lp=b[l],rp=b[r];
	if(lp==rp)
	  for(int i=l;i<=r;i++)
	  {
	  	add[i]++;
	  	if(a[i]==1)
	  	{
	  		a[i]=0;
				sum[lp]--;
			}  
	  	else
	  	{
	  		a[i]=1;
				sum[lp]++;
			}
		}
	else
	{
		for(int i=lp+1;i<=rp-1;i++)
		{
			add[i]++;
			sum[i]=rp-1-lp-1+1-sum[i];
		}
		for(int i=l;b[i]==lp;i++)
		{
			if(a[i]==1)
	  	{
	  		a[i]=0;
				sum[lp]-=1;
			}  
	  	else
	  	{
	  		a[i]=1;
				sum[lp]+=1;
			}
		}
		for(int i=r;b[i]==rp;i--)
		{
			if(a[i]==1)
	  	{
	  		a[i]=0;sum[rp]--;
			}  
	  	else
	  	{
	  		a[i]=1;sum[rp]++;
			}
		}
		
	}
}

inline ll ask(int l,int r)
{
	lp=b[l],rp=b[r];
	ans=0;
	if(lp=rp)
	  for(int i=l;i<=r;i++)
	  {
	  	if(add[i]%2==1&&a[i]==0)
	  	  ans++;  
	  	if(add[i]%2==0&&a[i]==1)
			  ans++;  
		}
	else
	{
		for(int i=lp+1;l<=rp-1;i++)
		  ans+=sum[i];
		for(int i=l;b[i]==lp;i++)
		{
			if(add[i]%2==1&&a[i]==0)
	  	  ans++;
	  	if(add[i]%2==0&&a[i]==1)
			  ans++;  
		}  
		for(int i=r;b[i]==rp;i--)
		{
			if(add[i]%2==1&&a[i]==0)
	  	  ans++;
	  	if(add[i]%2==0&&a[i]==1)
			  ans++;  
		}
		  	  
	}    
	return ans;
}

int main()
{
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m;
	c=sqrtl(n);
	
	
	for(int i=1;i<=n;i++)
		b[i]=(i-1)/c+1;

	
  	
	
	
	while(m--)
	{
		cin>>op>>l>>r;
		if(op==0)
		  change(l,r);
		else
		  cout<<ask(l,r)<<'\n';
	} 
	
	
	
	return 0;
}
  
2024/7/23 09:25
加载中...