站外题求助
  • 板块学术版
  • 楼主multiple_set
  • 当前回复15
  • 已保存回复15
  • 发布时间2024/3/13 22:16
  • 上次更新2024/3/14 13:05:55
查看原帖
站外题求助
1216364
multiple_set楼主2024/3/13 22:16

题面:

没错啊还是某xmoj的题

线段树WA50pts,求调。

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int tr[N<<2], tg[N<<2];
int ls(int x) { return x << 1; }
int rs(int x) { return x << 1 | 1; }
void build(int rt, int l, int r)
{
	if (l == r) { tr[rt] = 0; return ; }
	int mid = (l + r) >> 1;
	build(ls(rt), l, mid), build(rs(rt), mid + 1, r);
	tr[rt] = tr[ls(rt)] + tr[rs(rt)];
}
void pushdown(int rt, int l, int r, int x) { tr[rt] = (r - l + 1) * x, tg[rt] = x; }
void add(int rt, int l, int r, int a, int b, int x)
{
	if (a <= l && r <= b) { pushdown(rt, l, r, x); return ; }
	int mid = (l + r) >> 1;
	if (tg[rt])
	{
		tr[ls(rt)] = tg[rt] * (mid - l + 1), tr[rs(rt)] = tg[rt] * (r - mid);
		tg[ls(rt)] = tg[rs(rt)] = tg[rt], tg[rt] = 0;
	}
	if (a <= mid) add(ls(rt), l, mid, a, b, x);
	if (b > mid) add(rs(rt), mid + 1, r, a, b, x);
	tr[rt] = tr[ls(rt)] + tr[rs(rt)];
}
int query(int rt, int l, int r, int a, int b)
{
	if (a <= l && r <= b) return tr[rt];
	int mid = (l + r) >> 1;
	if (tg[rt])
	{
		tr[ls(rt)] = tg[rt] * (mid - l + 1), tr[rs(rt)] = tg[rt] * (r - mid);
		tg[ls(rt)] = tg[rs(rt)] = tg[rt], tg[rt] = 0;
	}
	int ret = 0;
	if (a <= mid) ret += query(ls(rt), l, mid, a, b);
	if (b > mid) ret += query(rs(rt), mid + 1, r, a, b);
	return ret;
}

int main()
{
	int n, q; scanf("%d%d", &n, &q), build(1, 1, n);
	while (q--)
	{
		int a, b, c; scanf("%d%d%d", &a, &b, &c);
		c = 2 - c, c = 1 - c, add(1, 1, n, a, b, c);
	} printf("%d\n", n - tr[1]);
	return 0;
}
2024/3/13 22:16
加载中...