萌新求助分块
查看原帖
萌新求助分块
342868
qfpjm楼主2022/3/19 08:24
#include <bits/stdc++.h>

using namespace std;

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

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] ^= 1;
		}
		return ;
	}
	for (int i = l ; i <= ed[lb] ; i ++)
	{
		flag[i] ^= 1;
		if (flag[i] == 1)
		{
			cnt[lb] += 1;
		}
		else
		{
			cnt[lb] -= 1;
		}
	}
	for (int i = st[rb] ; i <= r ; i ++)
	{
		flag[i] ^= 1;
		if (flag[i] == 1)
		{
			cnt[rb] += 1;
		}
		else
		{
			cnt[rb] -= 1;
		}
	}
	for (int i = lb + 1 ; i <= rb - 1 ; i ++)
	{
		fblock[i] ^= 1;
		cnt[i] = ed[i] - st[i] + 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 ((flag[i] ^ fblock[lb]) == 1)
			{
				ans ++;
			}
		}
		return ans;
	}
	for (int i = l ; i <= ed[lb] ; i ++)
	{
		if ((flag[i] ^ fblock[lb]) == 1)
		{
			ans ++;
		}
	}
	for (int i = st[rb] ; i <= r ; i ++)
	{
		if ((flag[i] ^ fblock[rb]) == 1)
		{
			ans ++;
		}
	}
	for (int i = lb + 1 ; i <= rb - 1 ; i ++)
	{
		ans += cnt[i];
	}
	return ans;
}

int main()
{
	memset(fblock, 0, sizeof(fblock));
	memset(flag, 0, sizeof(flag));
	cin >> n >> m;
	sq = sqrt(n);
	for (int i = 1 ; i <= n ; i ++)
	{
		int s = i / sq + 1;
		if (!st[s])
		{
			st[s] = i;
		}
		ed[s] = i;
		block[i] = s;
	}
	while (m --)
	{
		int c, a, b;
		scanf("%d%d%d", &c, &a, &b);
		if (!c)
		{
			change(a, b);
//			for (int i = 1 ; i <= n ; i ++)
//			{
//				cout << (flag[i] ^ fblock[block[i]]) << " ";
//			}
//			cout << endl;
//			for (int i = 1 ; i <= sq + 1 ; i ++)
//			{
//				cout << st[i] << " " << ed[i] << ":" << cnt[i] << endl;
//			}
		}
		else
		{
			printf("%d\n", fd(a, b));
		}
	}
}

//0 0 0 0
//1 1 0 0
//1 0 1 1
//1 1 0 0
2022/3/19 08:24
加载中...