分块 10pts 样例过了 求助(玄关)
查看原帖
分块 10pts 样例过了 求助(玄关)
1139577
WydnksqhbD楼主2024/3/6 18:11
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m,len,cnt;
int a[N],id[N],charge[N],sum[N];
inline void update(int l,int r)
{
	if(id[l]==id[r])
	{
		for(int i=l;i<=r;i++)
		{
			a[i]^=1;
			if(a[i])sum[id[i]]++;
			else sum[id[i]]--;
		}
	}
	else
	{
		for(int i=l;i<=r;i++)
		{
			if(i%len==1&&i+len<=r)
			{
				sum[id[i]]=len-sum[id[i]];
				charge[id[i]]^=1;
				i+=len-1;
			}
			else
			{
				a[i]^=1;
				if(a[i])sum[id[i]]++;
				else sum[id[i]]--;
			}
		}
	}
}
inline int query(int l,int r)
{
	int total=0;
	if(id[l]==id[r])
	{
		for(int i=l;i<=r;i++)
			total+=(a[i]+charge[id[i]])%2;
	}
	else
	{
		for(int i=l;i<=r;i++)
		{
			if(i%len==1&&i+len<=r)
			{
				total+=sum[id[i]];
				i+=len-1;
			}
			else
			{
				total+=(a[i]+charge[id[i]])%2;
			}
		}
	}
	return total;
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	len=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		if(i%len==1)cnt++;
		id[i]=cnt;
	}
	while(m--)
	{
		int c,a,b;
		scanf("%lld%lld%lld",&c,&a,&b);
		if(c)printf("%lld\n",query(a,b));
		else update(a,b);
	}
 	return 0;
}
2024/3/6 18:11
加载中...