分块 WA 10 pts 只过了第二个点
查看原帖
分块 WA 10 pts 只过了第二个点
774985
rentianxiang楼主2024/7/18 22:21
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m, a[N], bl[N], L[N], R[N], blk, s, lt[N], num[N];
int f(int x) {
	if (x == 0)	return 1;
	return 0;
}
void init() {
	blk = sqrt(n);
	s = n/blk;
	for (int i = 1; i <= s; i++) {
		L[i] = (i - 1) * blk + 1;
		R[i] = i * blk;
	}
	if (R[s] < n) {
		s++;
		L[s] = R[s - 1] + 1;
		R[s] = n;
	}
	for (int i = 1; i <= s; i++) {
		for (int j = L[i]; j <= R[i]; j++) {
			bl[j] = i;
		}
	}
}
void update(int l, int r) {
	if (bl[l] == bl[r]) {
		for (int i = l; i <= r; i++) {
			num[bl[l]] -= a[i];
			a[i] = f(a[i]);
			num[bl[r]] += a[i];
		}
	} else {
		for (int i = l; i <= R[bl[l]]; i++) {
			num[bl[l]] -= a[i];
			a[i] = f(a[i]);
			num[bl[l]] += a[i];
		}
		for (int i = bl[l] + 1; i <= bl[r] - 1; i++) {
			lt[i]++;
			num[i] = R[i] - L[i] + 1 - num[i];
		}
		for (int i = L[bl[r]]; i <= r; i++) {
			num[bl[r]] -= a[i];
			a[i] = f(a[i]);
			num[bl[r]] += a[i];
		}
	}
}
void query(int l, int r) {
	int ret = 0;
	if (bl[l] == bl[r]) {
		for (int i = l; i <= r; i++) {
			if (lt[bl[l]] % 2 == 1)	ret += f(a[i]);
			else	ret += a[i];
		}
	} else {
		for (int i = l; i <= R[bl[l]]; i++) {
			if (lt[bl[l]] % 2 == 1)	ret += f(a[i]);
			else	ret += a[i];
		}
		for (int i = bl[l] + 1; i <= bl[r] - 1; i++) {
			ret += num[i];
		}
		for (int i = L[bl[r]]; i <= r; i++) {
			if (lt[bl[r]] % 2 == 1)	ret += f(a[i]);
			else	ret += a[i];
		}
	}
	cout << ret << '\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie();	cout.tie();
	cin >> n >> m;
	init();
	for (int i = 1; i <= m; i++) {
		int c, a, b;
		cin >> c >> a >> b;
		if (c == 0) {
			update(a, b);
		} else {
			query(a, b);
		}
	}
	return 0;
} 
2024/7/18 22:21
加载中...