1. 程式人生 > 實用技巧 >POJ-2528 Mayor's posters 線段樹 離散化

POJ-2528 Mayor's posters 線段樹 離散化

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(""); } }