蒟蒻求助
查看原帖
蒟蒻求助
201007
Leasier楼主2021/2/21 20:08

RT,初学分块,WA 0 了qwq

代码:

#include <stdio.h>
#include <math.h>

int belong[100007], lft[327], rt[327], a[100007], tag[327], sum[327];

inline void brute_force_update(int l, int r){
	if (tag[belong[l]] == 1){
		for (int i = lft[belong[l]]; i <= rt[belong[l]]; i++){
			a[i] ^= 1;
		}
		sum[belong[l]] = (rt[belong[l]] - lft[belong[l]] + 1) - sum[belong[l]];
		tag[belong[l]] = 0;
	}
	for (int i = l; i <= r; i++){
		sum[belong[l]] += (a[i] ^ 1) - a[i];
		a[i] ^= 1;
	}
}

inline void update(int l, int r){
	int l_ = belong[l - 1] + 1, r_ = belong[r + 1] - 1;
	brute_force_update(l, rt[belong[l - 1]]);
	brute_force_update(lft[belong[r + 1]], r);
	for (int i = l_; i <= r_; i++){
		tag[i] ^= 1;
	}
}

inline int brute_force_query(int l, int r){
	int ans = 0;
	for (int i = l; i <= r; i++){
		ans += a[i];
	}
	return ans;
}

inline int query(int l, int r){
	int l_ = belong[l - 1] + 1, r_ = belong[r + 1] - 1, ans = brute_force_query(l, rt[belong[l - 1]]) + brute_force_query(lft[belong[r + 1]], r);
	for (int i = l_; i <= r_; i++){
		if (tag[i] == 0){
			ans += sum[i];
		} else {
			ans += (rt[i] - lft[i] + 1) - sum[i];
		}
	}
	return ans;
}

int main(){
	int n, m, k;
	scanf("%d %d", &n, &m);
	k = sqrt(n);
	for (register int i = 1; i <= n; i++){
		belong[i] = (i + k - 1) / k;
	}
	for (register int i = 1; i <= k; i++){
		lft[i] = (i - 1) * k + 1;
		rt[i] = i * k;
	}
	if (rt[k] < n){
		k++;
		lft[k] = rt[k - 1] + 1;
		rt[k] = n;
	}
	k++;
	lft[k] = rt[k - 1] + 1;
	rt[k] = n + 1;
	belong[n + 1] = k + 1;
	for (register int i = 1; i <= m; i++){
		int c, a, b;
		scanf("%d %d %d", &c, &a, &b);
		if (c == 0){
			update(a, b);
		} else {
			printf("%d\n", query(a, b));
		}
	}
	return 0; 
}
2021/2/21 20:08
加载中...