求大佬帮调分块
查看原帖
求大佬帮调分块
453100
Tzs_yousa楼主2022/4/23 14:36

萌新复习分块寄了 只有样例和第一个点过了,感觉写的没问题啊 (内附部分过程量输出,注释的内容)

#include <bits/stdc++.h>
const int MAXN = 2e5 + 10;
#define int long long
using namespace std;
char s[MAXN];
int n, m, a[MAXN], t, q[MAXN], z[MAXN], y[MAXN], res[MAXN], lazy[MAXN];
void change(int l, int r)
{
	int L = q[l], R = q[r];
	if(L == R)
	{
		for (int i = l; i <= r; i++) 
		{
			if(a[i] == 0) res[L]++, a[i] = 1;
			else res[L]--, a[i] = 0;
		}
	}
	else
	{
		for (int i = l; i <= y[L]; i++) 
		{
			if(a[i] == 0) res[L]++, a[i] = 1;
			else res[L]--, a[i] = 0;
		}
		for (int i = L + 1; i <= R - 1; i++) lazy[i]++;
		for (int i = z[R]; i <= r; i++) 
		{
			if(a[i] == 0) res[R]++, a[i] = 1;
			else res[R]--, a[i] = 0;
		}
	}
}
int query(int l, int r)
{
	int L = q[l], R = q[r];
	if(L == R)
	{
		int ans = 0;
		for (int i = l; i <= r; i++) 
		{
			if((a[i] + lazy[i]) % 2 == 1) ans++;
		}
		return ans;
	}
	else
	{
		int ans = 0;
		for (int i = l; i <= y[L]; i++) 
		{
			if((a[i] + lazy[L]) % 2 == 1) ans++;
		}
		for (int i = L + 1; i <= R - 1; i++) 
		{
			if(lazy[i] % 2 == 0) ans += res[i];
			else ans += (y[i] - z[i] + 1 - res[i]);
		}
		for (int i = z[R]; i <= r; i++) 
		{
			if((a[i] + lazy[R]) % 2 == 1) ans++;
		}
		return ans;
	}
}
signed main()
{
	scanf("%lld%lld", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		cin >> s[i];
		a[i] = s[i] - '0';
	}
	t = sqrt(n);
	for (int i = 1; i <= t; i++)
	{
		z[i] = (i - 1) * t + 1;
		y[i] = i * t;
	}
	if(y[t] < n) t++, z[t] = y[t - 1] + 1, y[t] = n;
	for (int i = 1; i <= t; i++)
	{
		for (int j = z[i]; j <= y[i]; j++)
		{
			q[j] = i;
			res[i] += a[j];
		}
	}
	/*cout << endl;
	cout << "t: " << t << endl;
	for (int i = 1; i <= t; i++) cout << z[i] << " " << y[i] << endl;
	cout << endl;
	for (int i = 1; i <= t; i++) cout << res[i] << " q[i]: " << q[i] << endl;*/
	for (int i = 1; i <= m; i++)
	{
		int op, l, r;
		scanf("%lld%lld%lld", &op, &l, &r);
		if(op == 0) 	
		{
			change(l, r);
			//for (int i = 1; i <= n; i++) 
			//{
			//	printf("%lld ", (a[i] + lazy[q[i]]) % 2);
			//}
			//cout << endl;
		}
		else printf("%lld\n", query(l, r));
	}
	return 0;
}
2022/4/23 14:36
加载中...