分块10pts求调 样例能过,#2 和hack也可以过
查看原帖
分块10pts求调 样例能过,#2 和hack也可以过
503074
SoapMactavish楼主2023/8/30 10:58
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
bool light[MAXN];
int belong[MAXN], block[MAXN], l[MAXN], r[MAXN];
bool lazy[MAXN];
int n, m;
void init() {
	int siz = sqrt(n);
	if (n % siz != 0) {
		siz++;
	}
	int n1 = n, now = 0;
	for (int i = 1; n1; i++) {
		if (n1 >= siz) {
			l[i] = now + 1;
			r[i] = now + siz;
			now += siz;
			n1 -= siz;
		}
		else {
			l[i] = now + 1;
			r[i] = n;
			n1 = 0;
		}
		for (int j = l[i]; j <= r[i]; j++) {
			belong[j] = i;
		}
	}
}
int main() {
	scanf("%d%d", &n, &m);
	init();
	for (int i = 1; i <= m; i++) {
		int op, x, y;
		scanf("%d%d%d", &op, &x, &y);
		if (!op) {
			if (belong[x] == belong[y]) {
				for (int j = x; j <= y; j++) {
					block[belong[x]] = block[belong[x]] - light[j] + (!light[j]);
					light[j] = !light[j];
				}
				continue;
			}
			for (int j = x; j <= r[belong[x]]; j++) {
				block[belong[x]] = block[belong[x]] - light[j] + (!light[j]);
				light[j] = !light[j];
			}
			for (int j = belong[x] + 1; j < belong[y]; j++) {
				lazy[j] = !lazy[j];
			}
			for (int j = l[belong[y]]; j <= y; j++) {
				block[belong[y]] = block[belong[y]] - light[j] + (!light[j]);
				light[j] = !light[j];
			}
		}
		else {
			int cnt = 0;
			for (int j = x; j <= r[belong[x]]; j++) {
				cnt += (lazy[belong[x]]) ? (!light[j]) : (light[j]);
			} 
			for (int j = belong[x] + 1; j < belong[y]; j++) {
				cnt += (lazy[j]) ? (r[j] - l[j] + 1 - block[j]) : (block[j]);
			}
			for (int j = l[belong[y]]; j <= y; j++) {
				cnt += (lazy[belong[y]]) ? (!light[j]) : (light[j]);
			}
			printf("%d\n", cnt); 
		}
	}
	return 0;
} 
2023/8/30 10:58
加载中...