10分求助
查看原帖
10分求助
373938
wowwowwow楼主2023/9/27 21:45

线段树,但是下沉标记是直接写在print函数里的

#include<bits/stdc++.h>
#define int long long 
using namespace std;

int n, m, a[101010], tree[401010];

bool lan[401010];

void build(int id, int l, int r){
	if(l == r){
		tree[id] = 0;
		return;
	}
	int mid = (l + r) / 2;
	build(id * 2, l, mid); build(id * 2 + 1, mid + 1, r);
	tree[id] = tree[id * 2] + tree[id * 2 + 1];
}

void change(int id, int l, int r, int x, int y){
	if(x > r || y < l) return;
	
//	x = max(l, x); y = min(r, y);
	
	if(l >= x && r <= y){
		tree[id] = (r - l + 1) - tree[id];
		lan[id] = !lan[id];
		return;
	}
	int mid = (l + r) / 2;
	change(id * 2, l, mid, x, y); change(id * 2 + 1, mid + 1, r, x, y);
	tree[id] = tree[id * 2] + tree[id * 2 + 1];
	return;
}

int print(int id, int l, int r, int x, int y, bool k){
	if(k){
		tree[id] = (r - l + 1) - tree[id];
		lan[id] = !lan[id];
	}
	if(x > r || y < l) return 0;
	
//	x = max(l, x); y = min(r, y);
	
	if(l >= x && r <= y){
		return tree[id];
	}
	
	int mid = (l + r) / 2; k = lan[id];
	lan[id] = 0;
	return print(id * 2, l, mid, x, y, k) + print(id * 2 + 1, mid + 1, r, x, y, k);
}
signed main(){
	cin >> n >> m;
    build(1, 1, n);                                                              
	while(m--){
		int f, x, y;
		cin >> f;
		if(f == 0){
			cin >> x >> y;
			change(1, 1, n, x, y);
		}
		if(f == 1){
			cin >> x >> y;
			cout << print(1, 1, n, x, y, 0) << endl;
		}
	}
//	cout << tree[4] << " " << tree[5] << " " << tree[12] << " " << tree[13] << " " << tree[7]; 
	return 0;
}
2023/9/27 21:45
加载中...