Mayor's posters

转载自:http://blog.csdn.net/winddreams/article/details/38443761

【题目链接】Mayor's posters

【题目类型】线段树+离散化

&题意:

给出一面墙,给出n张海报贴在墙上,每张海报都覆盖一个范围,问最后可以看到多少张海报

&题解:

海报覆盖的范围很大,直接使用数组存不下,但是只有最多10000张海报,也就是说最多出现20000个点,所以可以使用离散化,将每个点离散后,重新对给出控制的区间,这样区间最大就是1到20000.可以直接使用线段树,成段更新,每次更新一个颜色,最后遍历所有的段,将还可以遍历的颜色储存,统计

将-1 定义为没有颜色,0代表有多种颜色,1到m代表各自的颜色,线段树只要在0时向下深入,其他的直接统计颜色。

但是这个题中的离散化有问题,会挤掉中间的颜色,不过poj好像也是这么做的,没有考虑中间的颜色。

如 1 ,10 1,4 7,10 这三组数的正确结果应该是还可以看到3种颜色,但是如果直接排列点的话就会挤掉5到6这一种颜色。

真正的这种成段的离散化,一定要将两个节点中还有值的话,要多加一个节点,代表两个节点中间的值。

&代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 30005
#define lmin 1
#define rmax n
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
#define root lmin,rmax,1
#define now l,r,rt
#define int_now int l,int r,int rt
int cl[maxn<<2],lazy[maxn<<2],a[maxn];
struct node{
int id1,id2,k;
}p[maxn];
bool cmp(node a,node b){
return a.k<b.k;
}
void push_up(int rt){
if (!cl[rt<<1]||!cl[rt<<1|1]
||cl[rt<<1]!=cl[rt<<1|1]){
cl[rt]=0;
}
else{
cl[rt]=cl[rt<<1];
}
}
void push_down(int rt){
if (lazy[rt]!=-1){
lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
cl[rt<<1]=cl[rt<<1|1]=lazy[rt];
lazy[rt]=-1;
}
}
void update(int ll,int rr,int x,int_now){
if (ll>r||rr<l) return ;
if (ll<=l&&r<=rr){
cl[rt]=lazy[rt]=x;
return ;
}
push_down(rt);
update(ll,rr,x,lson);
update(ll,rr,x,rson);
push_up(rt);
}
void query(int ll,int rr,int_now,int *a){
if (cl[rt]==-1) return ;
if (cl[rt]>0){
a[cl[rt]]=1;
return;
}
push_down(rt);
query(ll,rr,lson,a);
query(ll,rr,rson,a);
}
int main(){
int t,i,n,m,l,r,x;
scanf("%d",&t);
while(t--){
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d%d",&p[i].k,&p[i+m].k);
p[i].id1=i;
p[i+m].id1=i+m;
}
sort(p,p+2*m,cmp);
int temp=-1;
n=0;
for(i=0;i<2*m;i++){
if (p[i].k==temp){
p[i].id2=n;
}
else{
p[i].id2=++n;
temp=p[i].k;
}
a[p[i].id1]=p[i].id2;
}
memset(cl,-1,sizeof(cl));
memset(lazy,-1,sizeof(lazy));
for(int i=0;i<m;i++){
update(a[i],a[i+m],i+1,root);
}
memset(a,0,sizeof(a));
query(1,n,root,a);
int num=0;
for(int i=1;i<=m;i++){
if (a[i]) num++;
}
printf("%d\n",num );
}
}

POJ 2528 Mayor's posters(线段树+离散化)的更多相关文章

  1. poj 2528 Mayor's posters 线段树+离散化技巧

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

  2. poj 2528 Mayor's posters 线段树+离散化 || hihocode #1079 离散化

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

  3. POJ 2528 Mayor's posters (线段树+离散化)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:75394   Accepted: 21747 ...

  4. POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)

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

  5. POJ 2528 Mayor's posters (线段树区间更新+离散化)

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

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

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

  7. poj 2528 Mayor's posters 线段树区间更新

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

  8. poj 2528 Mayor's posters(线段树)

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

  9. POJ 2528 Mayor's posters (线段树)

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

随机推荐

  1. C# 字符编码解码 Encoder 和Decoder

    在网络传输和文件操作中,如果数据量很大,需要将其划分为较小的快,此时可能出现一个数据块的末尾是一个不匹配的高代理项,而与其匹配的低代理项在下一个数据块. 这时候使用Encoding的GetBytes方 ...

  2. 在CentOS上安装rabbitmq-server

    ***在 CentOS 6.4上安装python*** 注意啊,自己手动安装python2.7.5,不要动系统上面其他的版本 1,先安装GCC,用如下命令yum install gcc gcc-c++ ...

  3. 《看板与Scrum》读书笔记

    看板的朴素思想:在制品(work-in-progress, WIP)必须被限制 WIP上限和拉动式生产 1. Scrum与看板简述 Scrum:组织拆分,工作拆分,开发时间拆分,优化发布计划,过程优化 ...

  4. 关于OpenGL的绘制上下文

    什么是绘制上下文(Rendering Context) 初学OpenGL,打开红宝书,会告诉你OpenGL是个状态机,OpenGL采用了客户端-服务器模式,那时觉得好抽象,直到后来了解了绘制上下文才把 ...

  5. js 打印星星金字塔

    /** * * 第一行: * * 第二行: *** * 第三行: ***** * 第四行: ******* * 第五行: ********* * */ document.write('<p al ...

  6. google.GIS小例子

    var map; var array = [[41.774166667, 85.943055556], [43.864052, 87.560499]];//经纬度 var array1 = [&quo ...

  7. linuxz终端开启echo颜色显示

    echo输出命令echo [选项] [输出内容]-e //支持反斜线控制的字符转换:控制字符:\a //输出警告音:\b //退格键,也就是向左删除键:\n //换行符:\r //回车键:\t //制 ...

  8. Android——播放器和图片轮播

    layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  9. Delphi常用关键字用法详解

    本文详细介绍了Delphi中常用的各个关键字名称及用法,供大家在编程过程中借鉴参考之用.详情如下: absolute: ? 1 2 3 4 5 6 7 8 9 10 //它使得你能够创建一个新变量, ...

  10. java疑问-继承问题

    存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么?如 C = (C) B: