题面:

没错啊还是某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;
}