Loading

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

 

posted @ 2020-08-07 09:32  MQFLLY  阅读(92)  评论(0编辑  收藏  举报