分块萌新被版题创飞求条
  • 板块灌水区
  • 楼主mediocre_
  • 当前回复9
  • 已保存回复9
  • 发布时间2024/10/19 12:04
  • 上次更新2024/10/19 14:26:08
查看原帖
分块萌新被版题创飞求条
565707
mediocre_楼主2024/10/19 12:04

题目传送门

#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
int n, m, a[N], add[N], pos[N], L[N], R[N], sum[N];
void change(int l, int r) {
	int p = pos[l], q = pos[r], cnt = 0;
	if (p == q) {
		for (int i = l; i <= r; ++i) cnt += a[i], a[i] = !a[i];
		sum[p] = (r - l + 1) - cnt;
	}
	else {
		for (int i = p + 1; i <= q - 1; ++i) add[i] = !add[i];
		for (int i = l; i <= R[p]; ++i) cnt += a[i], a[i] = !a[i];
		sum[p] = (R[p] - l + 1) - cnt;
		cnt = 0;
		for (int i = L[q]; i <= r; ++i) cnt += a[i], a[i] = !a[i];
		sum[q] = (r - L[q] + 1) - cnt;
	}
}
int ask(int l, int r) {
	int p = pos[l], q = pos[r], ans = 0;
	if (p == q) {
		for (int i = l; i <= r; ++i) ans += a[i];
		if (add[p]) ans = (r - l + 1) - ans;
	}
	else {
		for (int i = p + 1; i <= q - 1; ++i) ans += (add[i]) ? (R[i] - L[i] + 1) - sum[i] : sum[i];
		int cnt = 0;
		for (int i = l; i <= R[p]; ++i) cnt += a[i];
		if (add[p]) ans = (R[p] - l + 1) - cnt;
		else ans += cnt;
		cnt = 0;
		for (int i = L[q]; i <= r; ++i) cnt += a[i];
		if (add[q]) ans = (r - L[q] + 1) - cnt;
		else ans += cnt;
	}
	return ans;
}
int main() {
	scanf("%d%d", &n, &m);
	int t = sqrt(n);
	for (int i = 1; i <= t; ++i) {
		L[i] = (i - 1) * t + 1;
		R[i] = i * t;
	}
	if (R[t] < n) L[++t] = R[t - 1] + 1, R[t] = n;
	for (int i = 1; i <= t; ++i) 
		for (int j = L[i]; j <= R[i]; ++j)
			pos[j] = i;
	while (m--) {
		int opt, l, r;
		scanf("%d%d%d", &opt, &l, &r);
		if (!opt) change(l, r);
		else printf("%d\n", ask(l, r));
	}
	return 0;
}

测了很多样例均无错误

大佬帮忙调调或者能给组hack吗

2024/10/19 12:04
加载中...