藍橋杯 校外的樹 線段樹
阿新 • • 發佈:2019-01-31
#include <iostream> #include <stdio.h> #define N 10010 #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 using namespace std; int n, m; int sum[N << 2]; bool lazy[N << 2]; void up(int rt) { if (lazy[rt]) { lazy[rt<<1] = lazy[rt<<1|1] = lazy[rt]; sum[rt<<1] = sum[rt<<1|1] = 0; lazy[rt] = false; } } void build(int l, int r, int rt) { lazy[rt] = false; if (l == r) { sum[rt] = 1; return ; } int mid = (l + r) >> 1; build(lson); build(rson); sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } void update(int L, int R, int l, int r, int rt) { if (L <= l && r <= R) { lazy[rt] = true; sum[rt] = 0; return ; } up(rt); int mid = (l + r) >> 1; if (L <= mid) update(L, R, lson); if (R > mid) update(L, R, rson); sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } int main() { scanf("%d%d", &n, &m); build(0, n, 1); while (m--) { int l, r; scanf("%d%d", &l, &r); update(l, r, 0, n, 1); } printf("%d\n", sum[1]); return 0; }