社区讨论

负数好耶

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@loa2kqd7
此快照首次捕获于
2023/10/28 21:20
2 年前
此快照最后确认于
2023/11/02 11:00
2 年前
查看原帖
就离谱,样例能跑出负数来。。。
CPP
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5+10;
struct Node
{
	int l, r;
	int sum, tag;
} tr[N << 2];
int n, m;
void push_up(Node &u, Node &l, Node &r)
{
	u.sum = l.sum + r.sum;
}
void push_up(int p) { push_up(tr[p], tr[2 * p], tr[2 * p + 1]); }
void push_down(Node &u, Node &l, Node &r)
{
	if(!u.tag) return;
	l.sum = (l.r - l.l + 1) - l.sum;
	r.sum = (r.r, r.l + 1) - r.sum;
	if(l.tag == 0) l.tag = 1;
	else l.tag = 0;
	if(r.tag == 0) r.tag = 1;
	else r.tag = 0;
	u.tag = 0;
}
void push_down(int p) { push_down(tr[p], tr[2 * p], tr[2 * p + 1]); }
void build(int p, int l, int r)
{
	if(l == r)
	{
		tr[p] = {l, r, 0, 0};
		return;
	}
	tr[p] = {l ,r, 0, 0};
	int mid = l + r >> 1;
	build(2 * p, l, mid);
	build(2 * p + 1, mid + 1, r);
}
void modify(int p, int l, int r)
{
	if(l <= tr[p].l && tr[p].r <= r)
	{
		tr[p].sum = (tr[p].r - tr[p].l + 1) - tr[p].sum;
		if(tr[p].tag == 0) tr[p].tag = 1;
		else tr[p].tag = 0;
		return;
	}
	push_down(p);
	int mid = tr[p].l + tr[p].r >> 1;
	if(l <= mid) modify(2 * p, l, r);
	if(r > mid) modify(2 * p + 1, l, r);
	push_up(p);	
	printf("%d[%d, %d] : %d\n", p, tr[p].l, tr[p].r, tr[p].sum);
}
int query(int p, int l, int r)
{
	if(l <= tr[p].l && tr[p].r <= r)
		return tr[p].sum;
	push_down(p);
	int mid = tr[p].l + tr[p].r >> 1, res = 0;
	if(l <= mid) res += query(2 * p, l, r);
	if(r > mid) res += query(2 * p + 1, l, r);
	printf("%d[%d, %d] : %d\n", p, tr[p].l, tr[p].r, res);
	return res;
}
int main()
{
	freopen("in", "r", stdin);
	freopen("out", "w", stdout);
	scanf("%d%d", &n, &m);
	build(1, 1, n);
	int c, a, b;
	while(m --)
	{
		scanf("%d%d%d", &c, &a, &b);
		if(c == 0) modify(1, a, b);
		else printf("%d\n", query(1, a, b));
		printf("\n");
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

回复

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

正在加载回复...