分块求调……
查看原帖
分块求调……
316855
Gunpowder_OI楼主2022/11/25 18:19

蒟蒻第一道分块……

link

#include <bits/stdc++.h>
using namespace std;
struct block {
	int sum;
	bool tag;
}b[1010];
int n, m, opt, in1, in2, len, id[100010];
bool a[100010];
void rev (int, int);
void query (int, int);
int main (){
	scanf ("%d%d", &n, &m);
	len = sqrt (n);
	for (int i = 1; i <= n; i++)id[i] = (i - 1) / len + 1;
	for (int i = 1; i <= m; i++){
		scanf ("%d%d%d", &opt, &in1, &in2);
		if (!opt)rev (in1, in2);
		else query (in1, in2);
	}
	return 0;
}
void rev (int l, int r){
	for (int i = l; i <= min (r, id[l] * len); i++){
		b[id[l]].sum += a[i] ? -1 : 1;
		a[i] ^= 1;
	}
	if (id[l] != id[r]){
		for (int i = (id[r] - 1) * len + 1; i <= r; i++){
			b[id[r]].sum += a[i] ? -1 : 1;
			a[i] ^= 1;
		}
	}
	for (int i = id[l] + 1; i <= id[r] - 1; i++){
		b[i].tag ^= 1;
		b[i].sum = id[i] == len + 1 ? n - len * len - b[i].sum : len - b[i].sum;
	}
}
void query (int l, int r){
	int ans = 0;
	for (int i = l; i <= min (r, id[l] * len); i++)ans += a[i] ^ b[l].tag;
	if (id[l] != id[r]){
		for (int i = (id[r] - 1) * len + 1; i <= r; i++)ans += a[i] ^ b[r].tag;
	}
	for (int i = id[l] + 1; i <= id[r] - 1; i++)ans += b[i].sum;
	cout << ans << '\n';
}
2022/11/25 18:19
加载中...