• POJ 2528 Mayor's poster


    主要是参考了这个博客 地址戳这儿

    题目大意:n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000) 。求出最后还能看见多少张海报。

    对于输入要离散化,之后线段树维护张贴的状态。

    留意由于一般的离散化可能导致一些区间被“挤压掉”

    比如

    1-10 1-4 5-10
    1-10 1-4 6-10  被处理成了一样的情况导致错漏。

    方法是在相差超过1的相邻点插多一个点,使得离散化的时候不会挤压在一起。还有要注意的地方就是空间开多大,一般是要开4倍点空间,但是由于上述增加点的操作会新增加一些点,直接4*2e4是不行的,直接开8×2e4就ok了。

    还有,离散化映射的时候能不用STL最好,宁可开个1kw的数组映射,或者用二分法映射,否则容易TLE。

    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    
    #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
    const int maxN=1e4+5;
    int N, M, K, T;
    
    struct Post{int x, y;}nd[maxN];
    int g[maxN * 8], sg[maxN * 16], vis[maxN];
    int ans;
    
    #define lson l,m,rt*2
    #define rson m+1,r,rt*2+1
    
    void push_down(int rt) {
        if (sg[rt] == -1) return;
        sg[rt * 2] = sg[rt * 2 + 1] = sg[rt];
        sg[rt] = -1;
    }
    void update(int L, int R, int C, int l, int r, int rt) {
        if (L <= l && r <= R) {
            sg[rt] = C;
            return;
        }
        push_down(rt);
        int m = (l + r) / 2;
        if (L <= m) update(L, R, C, lson);
        if (R > m) update(L, R, C, rson);
    }
    void query(int l, int r, int rt) {
        if (sg[rt] != -1) {
            if (vis[sg[rt]] == 0)
                ++ans;
            vis[sg[rt]] = 1;
            return;
        }
        if (l == r) return;
        int m = (l + r) / 2;
        query(lson);
        query(rson);
    }
    
    int main () {
    #ifndef ONLINE_JUDGE
        freopen("data.in", "r", stdin);
    #endif
        scanf("%d", &T);
        while (T--) {
            // 输入及离散化
            scanf("%d", &N);
            int cnt = 0;
            FOR(i, 1, N) {
                scanf("%d%d", &nd[i].x, &nd[i].y);
                g[cnt++] = nd[i].x;
                g[cnt++] = nd[i].y;
            }
            sort(g, g + cnt);
            int m = unique(g, g + cnt) - g;
            int ocnt = m;
            FOR(i, 0, ocnt - 1)
                if (g[i + 1] - g[i] > 1)
                    g[m++] = g[i] + 1;
            sort(g, g + m);
    
            // 建线段树以及输出答案
            memset(sg, -1, sizeof sg);
            memset(vis, 0, sizeof vis);
    
            FOR(i, 1, N) {
                int l = lower_bound(g, g + m, nd[i].x) - g;
                int r = lower_bound(g, g + m, nd[i].y) - g;
                update(l, r, i, 0, m, 1);
            }
            ans = 0;
            query(0, m, 1);
            printf("%d
    ", ans);
        }
        return 0;
    }


     

  • 相关阅读:
    8.20 附加赛3
    8.22 附加赛4
    Codeforces Round #505 (Div 1 + Div 2) (A~D)
    8.9 附加赛2
    8.10 正睿暑期集训营 Day7
    8.9 正睿暑期集训营 Day6
    8.8 正睿暑期集训营 Day5
    8.7 正睿暑期集训营 Day4
    8.6 正睿暑期集训营 Day3
    8.5 正睿暑期集训营 Day2
  • 原文地址:https://www.cnblogs.com/Rosebud/p/9067918.html
Copyright © 2020-2023  润新知