分块10pts求调玄关
查看原帖
分块10pts求调玄关
1235819
_std_xzh楼主2024/12/20 21:31
#include<bits/stdc++.h>
#define int long long
using namespace std;
int p[100005] , s[1005] , e[1005] , len[1005] , tg[1005] , sum[100005] , bl , bn;
int n , m , c , a , b , d[100005];
void init(){
	bl = sqrt(n);
	if(n % bl)bn = bl + 1;
	else bn = bl;
	for(int i = 1;i <= bn;i++){
		s[i] = (i - 1) * bl + 1;
		e[i] = i * bl;
	}
	e[bn] = n;
	for(int i = 1;i <= bn;i++)len[i] = e[i] - s[i] + 1;
	for(int i = 1;i <= bn;i++){
		for(int j = s[i];j <= e[i];j++)p[j] = i;
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n >> m;
	init();
	while(m--){
		cin >> c >> a >> b;
		if(c == 0){
			if(p[a] == p[b]){
				for(int i = a;i <= b;i++){
					if(d[i])sum[p[a]]--;
					else sum[p[a]]++;
					d[i] = !d[i];
				}
			}else{
				for(int i = a;i <= e[p[a]];i++){
					if(d[i])sum[p[a]]--;
					else sum[p[a]]++;
					d[i] = !d[i];
				}
				for(int i = p[a] + 1;i < p[b];i++)tg[i] += sum[i] - (len[i] - sum[i]) , sum[i] = len[i] - sum[i];
				for(int i = s[p[b]];i <= b;i++){
					if(d[i])sum[p[b]]--;
					else sum[p[b]]++;
					d[i] = !d[i];
				}
			}
		}
		else{
			int ans = 0;
			if(p[a] == p[b]){
				for(int i = a;i <= b;i++)ans += d[i] + tg[p[a]];
			}else{
				for(int i = a;i <= e[p[a]];i++)ans += d[i] + tg[p[a]];
				for(int i = p[a] + 1;i < p[b];i++)ans += sum[i];
				for(int i = s[p[b]];i <= b;i++)ans += d[i] + tg[p[b]];
			}
			cout << ans << '\n';
		}
	}
	return 0;
} 
2024/12/20 21:31
加载中...