求助
查看原帖
求助
846303
Stdinout楼主2024/1/12 22:24

WA + TLE + RE + AC

蒟蒻分块代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int maxm = 1e5 + 5;
int n, m, siz, num;
int a[maxn], L[maxm], R[maxm], bel[maxn];
int sum[maxm];
int tag[maxm];
inline void build(){
	scanf("%d%d", &n, &m);
	siz = pow(n, 2.0 / 3);
	num = ceil(n / siz);
	for(int i = 1; i <= n; i++){
		a[i] = 0;
		bel[i] = (i - 1) / siz + 1;
		sum[bel[i]] += a[i];
	}
	for(int i = 1; i <= num; i++){
		L[i] = (i - 1) * siz + 1;
		R[i] = min(n, i * siz);
	}
}
inline void add(int l, int r){
	if(bel[l] == bel[r]){
		for(int i = l; i <= r; i++){
			a[i] = !a[i];
		}
		return;
	}
	else{
		int p = bel[l], q = bel[r];
		for(int i = p + 1; i <= q - 1; i++){
			tag[i] ++;
		}
		for(int i = l; i <= R[p]; i++){
			sum[i] -= a[i];
			a[i] = !a[i];
			sum[i] += a[i];
		}
		for(int i = r; i >= L[q]; i--){
			sum[i] -= a[i];
			a[i] = !a[i];
			sum[i] += a[i];
		}
	}
}
inline int ask(int l, int r){
	int ans = 0;
	if(bel[l] == bel[r]){
		for(int i = l; i <= r; i++){
			ans += (a[i] + (tag[bel[l]] & 1 ? 1 : 0)) % 2;
		}
		return !printf("%d\n", ans);
	}
	else{
		int p = bel[l], q = bel[r];
		for(int i = l; i <= R[p]; i++){
			ans += (a[i] + tag[p] & 1 ? 1 : 0) % 2;
		}
		for(int i = r; i >= L[q]; i--){
			ans += (a[i] + tag[bel[r]] & 1 ? 1 : 0) % 2;
		}
		for(int i = p + 1; i <= q - 1; i++){
			if(tag[i] & 1){
				ans += siz - sum[i];
			}
			else{
				ans += sum[i];
			}
		}
		return !printf("%d\n", ans);
	}
}
int main(){
	build();
	while(m --> 0){
		int opt, l, r;
		scanf("%d%d%d", &opt, &l, &r);
		if(opt == 0){
			add(l, r);
		}
		else{
			ask(l, r);
		}
	}
	return 0;
}
2024/1/12 22:24
加载中...