分块没过样例求调
查看原帖
分块没过样例求调
677091
MnZnOIer楼主2024/5/29 19:48
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, a[100005], pos[100005], tag[505], sum[505], L[505], R[505];
void pre ()
{
	int k = sqrt (n);
	for (int i = 1; i <= k; ++ i)L[i] = n / k * (i - 1) + 1, R[i] = n / k * i;
	R[k] = n;
	for (int i = 1; i <= k; ++ i)for (int j = L[i]; j <= R[i]; ++ j)pos[j] = i;
}
void update (int x, int y)
{
	int l = pos[x], r = pos[y];
	if (l == r)for (int i = x; i <= y; ++ i)
	{
		++ a[i];
		if (a[i] % 2 == 0)-- sum[l];
		else ++ sum[l];
	}
	else
	{
		for (int i = x; i <= R[l]; ++ i)
		{
			++ a[i];
			if (a[i] % 2 == 0)-- sum[l];
			else ++ sum[l];
		}
		for (int i = L[r]; i <= y; ++ i)
		{
			++ a[i];
			if (a[i] % 2 == 0)-- sum[r];
			else ++ sum[r];
		}
		for (int i = l + 1; i < r; ++ i)++ tag[i];
	}
}
void query (int x, int y)
{
	int l = pos[x], r = pos[y], ans = 0;
	if (l == r)for (int i = x; i <= y; ++ i)if (tag[l] + a[i] % 2)++ ans;
	else
	{
		for (int i = x; i <= R[l]; ++ i)if (tag[l] + a[i] % 2)++ ans;
		for (int i = L[r]; i <= y; ++ i)if (tag[r] + a[i] % 2)++ ans;
		for (int i = l + 1; i < r; ++ i)
		{
			if (tag[i] % 2)ans += (R[i] - L[i] + 1 - sum[i]);
			else ans += sum[i];
		}
	}
	cout << ans << '\n';
}
signed main ()
{
	ios::sync_with_stdio (0), cin.tie (0), cout.tie (0);
	cin >> n >> m;
	while (m --)
	{
		int op, l, r;
		cin >> op >> l >> r;
		if (op == 0)update (l, r);
		else query (l, r);
	}
	return 0;
}
2024/5/29 19:48
加载中...