n <= 10000 人贴海报,问最后可以看到的海报的个数。
1<=li<=ri<=10000000
由于范围很大,注意离散化。
bool vis[maxn * 4]; int a[maxn * 4]; int L[maxn * 4]; int R[maxn * 4]; int lazy[maxn * 4]; int ans; void Pushdown(int rt, int l,int r) { if (lazy[rt]) { lazy[rt << 1] = lazy[rt]; lazy[rt << 1 | 1] = lazy[rt]; lazy[rt] = 0; } } void Build(int i, int l, int r) { if (l == r) { return; } int mid = l + r >> 1; Build(i << 1, l, mid); Build(i << 1 | 1, mid + 1, r); } void update(int i, int l, int r, int L, int R, int v) { if (L <= l && r <= R) { lazy[i] = v; return; } Pushdown(i, l, r); int mid = l + r >> 1; if (L <= mid) update(i << 1, l, mid, L, R, v); if (R > mid) update(i << 1 | 1, mid + 1, r, L, R, v); } void query(int i, int l, int r) { if (lazy[i] && !vis[lazy[i]]) { ans++; vis[lazy[i]] = 1; return; } if (l == r) return; Pushdown(i, l, r); int mid = l + r >> 1; query(i << 1, l, mid); query(i << 1 | 1, mid + 1, r); } int main() { int T = readint(); while (T--) { ans = 0; memset(vis, 0, sizeof vis); memset(lazy, 0, sizeof lazy); int n = readint(); int cnt = 1; for (int i = 1; i <= n; i++) L[i] = readint(), R[i] = readint(), a[cnt++] = L[i], a[cnt++] = R[i]; sort(a + 1, a + cnt ); int m = unique(a + 1, a + cnt) - (a + 1); int tmp = m; for (int i = 2; i <= m; i++) { if (a[i] - a[i - 1] > 1) a[++tmp] = a[i - 1] + 1; } sort(a + 1, a + tmp + 1); for (int i = 1; i <= n; i++) { int p = lower_bound(a + 1, a + tmp + 1, L[i]) - a; int q = lower_bound(a + 1, a + tmp + 1, R[i]) - a; update(1, 1, tmp, p, q, i); } query(1, 1, tmp); Put(ans); puts(""); } }