10pts过了Hack求调,玄关
查看原帖
10pts过了Hack求调,玄关
573963
wbh20090611楼主2024/8/15 10:21
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 200005;
int n, m, a[N], l[N], r[N], sum[N], cnt, kk;
bool f[N];
int op;
void update(int x, int y)
{
	for (int i = 1; i <= cnt; i++)
	{
		if (l[i] >= x && r[i] <= y)
			f[i] = !f[i];
		else if (r[i] >= x && l[i] <= x)
		{
			if (f[i])
			{
				for (int j = l[i]; j < x; j++)
					a[j] = !a[j];
				f[i] = false;
				sum[i] = 0;
				for (int j = l[i]; j <= r[i]; j++)
					sum[i] += a[j];
			}
			else
			{
				for (int j = x; j <= r[i]; j++)
					a[j] = !a[j];
				f[i] = false;
				sum[i] = 0;
				for (int j = l[i]; j <= r[i]; j++)
					sum[i] += a[j];
			}
		}
		else if (l[i] <= y && y <= r[i])
		{
			if (f[i])
			{
				for (int j = y + 1; j <= r[i]; j++)
					a[j] = !a[j];
				f[i] = false;
				sum[i] = 0;
				for (int j = l[i]; j <= r[i]; j++)
					sum[i] += a[j];
			}
			else
			{
				for (int j = l[i]; j <= y; j++)
					a[j] = !a[j];
				f[i] = false;
				sum[i] = 0;
				for (int j = l[i]; j <= r[i]; j++)
					sum[i] += a[j];
			}
		}
	}
}
int query(int x, int y)
{
	int p = 0;
	for (int i = 1; i <= cnt; i++)
	{
		if (l[i] >= x && r[i] <= y)
		{
			if (f[i])
				p += r[i] - l[i] + 1 - sum[i];
			else
				p += sum[i];
		}
		else if (r[i] >= x && l[i] <= x)
		{
			if (f[i])
			{
				sum[i] = 0;
				for (int j = l[i]; j <= r[i]; j++)
				{
					a[j] = !a[j];
					sum[i] += a[j];
					if (j >= x && j <= y)
						p += a[j];
				}
				f[i] = false;
			}
			else
				for (int j = x; j <= r[i]; j++)
					p += a[j];
		}
		else if (l[i] <= y && r[i] >= y)
		{
			if (f[i])
			{
				sum[i] = 0;
				for (int j = l[i]; j <= r[i]; j++)
				{
					a[j] = !a[j];
					sum[i] += a[j];
					if (j >= x && j <= y)
						p += a[j];
				}
				f[i] = false;
			}
			else
				for (int j = l[i]; j <= y; j++)
					p += a[j];
		}
	}
	return p;
}
signed main()
{
	scanf("%lld%lld", &n, &m);
	kk = sqrt(n);
	for (int i = 1; i <= n; i += kk)
	{
		l[++cnt] = i;
		r[cnt] = min(i + kk - 1, n);
	}
	int x, y;
	while(m--)
	{
		scanf("%lld%lld%lld", &op, &x, &y);
		if (!op)
			update(x, y);
		else
			printf("%lld\n", query(x, y));
	}
}
2024/8/15 10:21
加载中...