分块过不了样例求调
查看原帖
分块过不了样例求调
342868
qfpjm楼主2022/1/15 08:12
#include <bits/stdc++.h>

using namespace std;

int n, m, sq, cnt[10005], block[10005], st[10005], ed[10005];
bool flag[10005], fblock[10005];

void change(int l, int r)
{
	int lb = block[l], rb = block[r];
	if (lb == rb)
	{
		for (int i = l ; i <= r ; i ++)
		{
			flag[i] = !flag[i];
			if (flag[i])
			{
				cnt[lb] ++;
			}
		}
		return ;
	}
	for (int i = l ; i <= ed[lb] ; i ++)
	{
		flag[i] = !flag[i];
		if (flag[i])
		{
			cnt[lb] ++;
		}
	}
	for (int i = st[rb] ; i <= r ; i ++)
	{
		flag[i] = !flag[i];
		if (flag[i])
		{
			cnt[rb] ++;
		}
	}
	for (int i = lb + 1 ; i <= rb - 1 ; i ++)
	{
		fblock[i] = !fblock[i];
		cnt[i] = ed[rb - 1] - st[lb + 1] + 1 - cnt[i];
	}
}

int fd(int l, int r)
{
	int lb = block[l], rb = block[r], ans = 0;
	if (lb == rb)
	{
		for (int i = l ; i <= r ; i ++)
		{
			if (!fblock[lb])
			{
				int s = !flag[i];
				if (s == 1)
				{
					ans ++;
				}
			}
			else
			{
				if (flag[i])
				{
					ans ++;
				}
			}
		}
		return ans;
	}
	for (int i = l ; i <= ed[lb] ; i ++)
	{
		if (!fblock[lb])
		{
			int s = !flag[i];
			if (s == 1)
			{
				ans ++;
			}
		}
		else
		{
			if (flag[i])
			{
				ans ++;
			}
		}
	}
	for (int i = st[rb] ; i <= r ; i ++)
	{
		if (!fblock[rb])
		{
			int s = !flag[i];
			if (s == 1)
			{
				ans ++;
			}
		}
		else
		{
			if (flag[i])
			{
				ans ++;
			}
		}
	}
	for (int i = lb + 1 ; i <= rb - 1 ; i ++)
	{
		ans += cnt[i];
	}
	return ans;
}

int main()
{
	cin >> n >> m;
	sq = sqrt(n);
	for (int i = 1 ; i <= n ; i ++)
	{
		int s = i / sq + 1;
		if (!st[s])
		{
			st[s] = i;
		}
		else
		{
			ed[s] = i;
		}
		block[i] = s;
	}
	while (m --)
	{
		int c, a, b;
		scanf("%d%d%d", &c, &a, &b);
		if (!c)
		{
			change(a, b);
		}
		else
		{
			printf("%d\n", fd(a, b));
		}
	}
}
2022/1/15 08:12
加载中...