社区讨论

Wa0pts求调

P3870[TJOI2009] 开关参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjdmx0m
此快照首次捕获于
2025/11/04 00:51
4 个月前
此快照最后确认于
2025/11/04 00:51
4 个月前
查看原帖
我应该是犯了一个很唐诗的错误,不然怎么连这种板子都写不出来了
CPP
#include<bits/stdc++.h>
using namespace std;
int n, m, lzy[500005], w[500005];
void pushup(int u) {
	w[u] = w[u * 2] + w[u * 2 + 1];
}
void maketag(int u, int len) {
	w[u] = len - w[u];
	if(lzy[u] == 1) lzy[u] = 0;
	else lzy[0] = 1;
}
void pushdown(int u, int l, int r) {
	int mid = l + r >> 1;
	if(lzy[u] == 0) return ;
	maketag(u * 2, mid - l + 1);
	maketag(u * 2 + 1, r - mid);
	lzy[u] = 0;
}
int InRange(int l, int r, int L, int R) {
	return (l >= L) && (r <= R); 
}
int OutofRange(int l, int r, int L, int R) {
	return (l > R) || (r < L);
}
void update(int u, int l, int r, int L, int R) {
	if(InRange(l, r, L, R)) {
		maketag(u, r - l + 1);
		return ;
	}
	if(OutofRange(l, r, L, R)) return ;
	int mid = l + r >> 1;
	pushdown(u, l, r);
	update(u * 2, l, mid, L, R);
	update(u * 2 + 1, mid + 1, r, L, R);
	pushup(u);
}
int query(int u, int l, int r, int L, int R) {
	if(InRange(l, r, L, R)) {
		return w[u];
	} 
	if(OutofRange(l, r, L, R)) {
		return 0;
	}
	int mid = l + r >> 1;
	pushdown(u, l, r);
	return query(u * 2, l, mid, L, R) + query(u * 2 + 1, mid + 1, r, L, R);
}
signed main() {
	cin >> n >> m;
	while(m --) {
		int op, l, r;
		cin >> op >> l >> r;
		if(op == 0) {
			update(1, 1, n, l, r);
		}
		else {
			cout << query(1, 1, n, l, r) << endl;
		}
	}
} 

回复

0 条回复,欢迎继续交流。

正在加载回复...