POJ 2528 Mayor’s posters (线段树段替换 && 离散化)

时间:2021-02-17 22:53:34

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

分析 : 很容易想到利用线段树来成段置换,最后统计总区间不同数的个数。但是这里有一个问题,就是区间可以很大,线段树开不了那么大的空间,遂想能不能离散化。实际上只记录坐标的相对大小进行离散化最后是不影响我们计算的,但是光是普通的离散化是不行的,就是我们贴海报的实际意义是对(l, r)段进行添加,而不是对于这个区间的点进行添加,是段树不是点树,如果这样普通离散化的话就会出现一个问题,比如数据1-10、1-4、6-10 行的,我们离散化后是1-4、1-2、3-4 ,不离散的结果是 3 但是离散化后再计算就是 2 了!原因就是我们是成段更新而不是点更新,进行添加海报的(l, r)的意义是对这一段进行添加,而离散化之后将原本不相邻的点变成了相邻的点,就导致了上面例子 4 - 6被覆盖了!解决这个问题的方法就是,在离散化的时候,将原本不相邻的两个点中间添加一个数,来表示中间是有“缝隙”的。

另外说一下 : POJ上的数据弱了,所以可能离散化的时候没有注意这个问题也能AC,可以去discuss板块里面看看大牛们的数据

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
using namespace std;
;
struct Interval{ int L, R; };
Interval Sec[maxn>>];
];
];
bool vis[maxn];
int ans;
void PushDown(int rt) {
       if (col[rt]) {
              col[rt<<] = col[rt<<|] = col[rt];
              col[rt] = ;
       }
}
void query(int l, int r, int rt)
{
    if(col[rt]){//下面的这一段都是 col[rt] 了, 所以不必再往下更新
        if(!vis[col[rt]]) ans++;
        vis[col[rt]] = true;
        return ;
    }
    if(l == r) return;
    ;
    query(lson);
    query(rson);
}
void update(int L,int R,int c,int l,int r,int rt) {
       if (L <= l && r <= R) {
              col[rt] = c;
              return ;
       }
       PushDown(rt);
       ;
       if (L <= m) update(L , R , c , lson);
       if (R > m) update(L , R , c , rson);
}
int main(void)
{
    int nCase;
    scanf("%d", &nCase);
    while(nCase--){
        ;
        memset(col, , sizeof(col));
        memset(vis, false, sizeof(vis));

        scanf("%d", &n);
        ; i<n; i++){
            scanf("%d %d", &Sec[i].L, &Sec[i].R);
            arr[top++] = Sec[i].L, //记录所有出现的点
            arr[top++] = Sec[i].R;
        }

        sort(arr, arr+top);
        top = unique(arr, arr+top) - arr;//将点去重

        ; i>; i--){
            ] + )//在原本不相邻的点中间添加一个数,因为后面是要sort的,所以添加在数组末尾即可
                arr[top++] = arr[i-] + ;//要做到这个操作只要从后往前判断就可以了,或者一开始把top的值记下来也行
        }

        sort(arr, arr+top);

        ans = ;
        ; i<n; i++){
            int l = lower_bound(arr, arr+top, Sec[i].L) - arr;//在离散化之后的坐标系arr中寻找左端点
            int r = lower_bound(arr, arr+top, Sec[i].R) - arr;//寻找右端点

            update(l+, r+, i+, , top, );//更新,注意离散化之后的坐标是从0开始的,这里我们把坐标人为+1进行计算
        }
        query(, top, );//查询整个区间统计不同数的个数
        printf("%d\n", ans);
    }
    ;
}

瞎 :对于线段树模版不能硬套,要结合题目对于模版进行适当的修改才能更好发挥这个数据结构的威力!例如这题的查询操作,在查询的时候提前判断下面是否都是一样的数了这个操作,如果死套模版,可能就是单点查询存数组再去unique判断,这个是很不明智的!

POJ 2528 Mayor’s posters (线段树段替换 && 离散化)的更多相关文章

  1. POJ 2528 Mayor&&num;39&semi;s posters &lpar;线段树区间更新&plus;离散化&rpar;

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

  2. POJ 2528 Mayor&&num;39&semi;s posters &lpar;线段树&plus;区间覆盖&plus;离散化)

    题意: 一共有n张海报, 按次序贴在墙上, 后贴的海报可以覆盖先贴的海报, 问一共有多少种海报出现过. 题解: 因为长度最大可以达到1e7, 但是最多只有2e4的区间个数,并且最后只是统计能看见的不同 ...

  3. POJ&period;2528 Mayor's posters &lpar;线段树 区间更新 区间查询 离散化&rpar;

    POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...

  4. poj 2528 Mayor&&num;39&semi;s posters 线段树&plus;离散化技巧

    poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...

  5. POJ 2528 Mayor&&num;39&semi;s posters&lpar;线段树&plus;离散化&rpar;

    Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...

  6. poj 2528 Mayor&&num;39&semi;s posters 线段树区间更新

    Mayor's posters Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=2528 Descript ...

  7. poj 2528 Mayor&&num;39&semi;s posters 线段树&plus;离散化 &vert;&vert; hihocode &num;1079 离散化

    Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...

  8. POJ 2528 Mayor&&num;39&semi;s posters &lpar;线段树)

    题目链接:http://poj.org/problem?id=2528 题目大意:有一个很上的面板, 往上面贴海报, 问最后最多有多少个海报没有被完全覆盖 解题思路:将贴海报倒着想, 对于每一张海报只 ...

  9. poj 2528 Mayor&&num;39&semi;s posters&lpar;线段树&rpar;

    题目:http://poj.org/problem?id=2528 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意的, 但是必定是单位宽度的整数 ...

随机推荐

  1. Neutron 网络基本概念 - 每天5分钟玩转 OpenStack(66)

    上次我们讨论了 Neutron 提供的功能,今天我们学习 Neutron 模块几个重要的概念. Neutron 管理的网络资源包括 Network,subnet 和 port,下面依次介绍. netw ...

  2. WPF使用IDataErrorInfo进行数据校验

    这篇博客将介绍如何使用IDataErrorInfo进行数据校验.下面直接看例子.一个Customer类,两个属性(FirstName, Age) class Customer { public str ...

  3. iOS 报错 &colon;Duplicate interface definition for class’&ast;&&num;39&semi;

    这个是重复导入引起的,但是一般的重复导入会在C里的include.而在项目中我们移动项目的位置,比如从某一文件夹移到另一文件夹,路径改变的话会导致项目的中预编译文件PrefixHeader.pch的路 ...

  4. Java中Properties类的操作配置文件

    知识学而不用,就等于没用,到真正用到的时 候还得重新再学.最近在看几款开源模拟器的源码,里面涉及到了很多关于Properties类的引用,由于Java已经好久没用了,而这些模拟器大多用 Java来写, ...

  5. 什么是image crop?

    一直对image crop很困惑,总算是看到了一篇描述较为简洁的说明:图像crop就是指从图像中移除不需要的信息,只保留需要的部分

  6. BZOJ 1603&colon; &lbrack;Usaco2008 Oct&rsqb;打谷机

    题目 1603: [Usaco2008 Oct]打谷机 Time Limit: 5 Sec  Memory Limit: 64 MB Description Farmer John有一个过时的打谷机( ...

  7. install plugin group&lowbar;replication ERROR 1126 &lpar;HY000&rpar;

    在给MySQL安装插件的时候,你可能会遇到如题所示的报错. 更详细的错误输出如下: mysql> INSTALL PLUGIN group_replication SONAME 'group_r ...

  8. Thinkjs关系数据库学习——查询数据

    模型提供了多种方法来查询数据: find 查询单条数据 select 查询多条数据 count 查询总条数 countSelect 分页查询数据 max 查询字段的最大值 avg 查询字段的平均值 m ...

  9. Elasticsearch 创建、更新、删除文档、处理冲突

    ----创建新文档---- 1._index,_type和_id的组合可以唯一标识一个文档,所以确保一个新文档的最简单的办法就是,使用索引请求的POST形式让elsticsearch自动生成唯一_id ...

  10. Oracle了解(一)

    通常所说的Oracle数据库服务器由一个数据库和至少一个数据库实例组成. 数据库实例是由系统后台进程和分配的内存区域构成 实例你是提供服务的进程,数据库是存放的数据. 数据库是存储数据的文件 数据库实 ...