线段树板子求调!!!
  • 板块灌水区
  • 楼主Tomwsc
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/19 13:48
  • 上次更新2024/10/19 15:46:57
查看原帖
线段树板子求调!!!
1418967
Tomwsc楼主2024/10/19 13:48

P3870

代码如下:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int MAXN = 4e5 + 10;
int n , m;
int tree[MAXN];
bool lazy[MAXN];

void pushup(int p) {
	tree[p] = tree[p << 1] + tree[p << 1 | 1];
	return;
}

void pushdown(int l , int r , int mid , int p) {
	if(lazy[p]) {
		tree[p << 1] = (mid - l + 1) - tree[p << 1];
		tree[p << 1 | 1] = (r - mid) - tree[p << 1 | 1];
		lazy[p << 1] = true;
		lazy[p << 1 | 1] = true;
		lazy[p] = false;
	}
	return;
}

void change(int l , int r , int x , int y , int p) {
	if(x <= l && r <= y) {
		tree[p] = (r - l + 1) - tree[p];
		if(lazy[p])
			lazy[p] = false;
		else
			lazy[p] = true;
		return;
	}
	int mid = (l + r) >> 1;
	pushdown(l , r , mid , p);
	if(x <= mid)
		change(l , mid , x , y , p << 1);
	if(mid < y)
		change(mid + 1 , r , x , y , p << 1 | 1);
	pushup(p);
	return;
}

int sum(int l , int r , int x , int y , int p) {
	if(x <= l && r <= y)
		return tree[p];
	int mid = (l + r) >> 1;
	int cnt = 0;
	pushdown(l , r , mid , p);
	if(x <= mid)
		cnt += sum(l , mid , x , y , p << 1);
	if(mid < y)
		cnt += sum(mid + 1 , r , x , y , p << 1 | 1);
	pushup(p);
	return cnt;	
}

signed main() {
	ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0);
	cin >> n >> m;
	while(m --) {
		int x , a , b;
		cin >> x >> a >> b;
		if(x == 0) 
			change(1 , n , a , b , 1);
		if(x == 1) 
			cout << sum(1 , n , a , b , 1) << '\n';
	}
	return 0;
}
2024/10/19 13:48
加载中...