POJ 2528 Mayor's posters(线段树)
题意 :建一堵墙粘贴海报,每个候选人只能贴一张海报,海报的高度与墙一样高,一张海报的宽度是整数个单位,墙被划分为若干个部分,每个部分的宽度为一个单位,每张海报完全的覆盖一段连续的墙体,墙体的宽度占整数个单位。因为候选人将海报贴到墙上的时候可能会将别人的覆盖或覆盖一部分,给出海报的大小,选举墙上张贴的位置,和张贴的次序,然后问你最后还能看到几张海报。
思路 : 这个墙因为有10000000单位长,而n最大有10000,所以要先进行离散化,但是离散化之前要先将数字存起来,排序之后再将每相邻的两个数之间一个数加入离散的数组,离散化的处理 :先将n张海报的左边界,右边界中间位置存储在数组x里,然后递增排序x,剔除其中重复的坐标,可以当成染色问题,就是贴上一张海报就将这张海报染上颜色。
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <algorithm> const int maxn = ; bool vis[maxn] ;//颜色i被使用的标志是vis[i]
int l[maxn],r[maxn],num[maxn*],tree[maxn*],x[maxn*] ;
//不大于左边界的不同坐标数为l[i],不大于右边界的不用坐标数为r[i],左边界的坐标为x[3*i-2],右边界的坐标
//为x[3*i-1],中间坐标为x[3*i]。x数组排序后在x[1...j]中不重复的坐标数为num[i].
int c,n ;
//线段树中结点k标记为tree[k],即代表区间的颜色码 using namespace std ; int binarysearch(int sum)//计算坐标区间[0...sum]中不同的坐标数
{
int l = , r = *n ;
while(r >= l)
{
int mid = (l+r) >> ;
if(x[mid] <= sum)
l = mid+ ;
else r = mid-;
}
return num[r] ;
} void update(int i)
{
if(!tree[i]) return ;
tree[i*] = tree[i*+] = tree[i] ;
tree[i] = ;
} void change(int tl,int tr,int l,int r,int i,int co)
{
if(tr < l || tl > r) return ;
if(tl <= l && r <= tr)
{
tree[i] = co ;
return ;
}
update(i) ;
int mid = (l+r) >> ;
change(tl,tr,l,mid,i*,co) ;
change(tl,tr,mid+,r,i*+,co) ;
} int require(int l ,int r,int i)
{
int mid = (l+r) >> ;
if(tree[i])
{
if(!vis[tree[i]])//在节点i已标记的情况下,若当前颜色未先涂过,则置该颜色使用标志并返回1,否则返回0,以防重复标记
{
vis[tree[i]] = ;
return ;
}
return ;
}
if(l == r) return ;
return require(l,mid,i*)+require(mid+,r,i+i+) ;
} void Init()//离散化处理海报信息
{
scanf("%d",&n) ;
for(int i = ; i <= n ;i++)
{
scanf("%d %d",&l[i],&r[i]) ;//读入每张海报的左右边界。
x[i*-] = l[i] ; x[i*-] = r[i] ;x[i*] = (l[i]+r[i])>> ;
}
sort(x+,x+*n+) ;
memset(num,,sizeof(num)) ;
for(int i = ; i <= *n ; i++)
{
num[i] = num[i-] ;
if(x[i] != x[i-]) num[i]++ ;
}
for(int i = ; i <= n ; i++)
{
l[i] = binarysearch(l[i]) ;
r[i] = binarysearch(r[i]) ;
}
} void solve()
{
memset(tree,,sizeof(tree)) ;//线段树中每个结点代表的区间未涂色
for(int i = ; i <= n ;i++)
change(l[i],r[i],,*n,,i) ;
memset(vis,false,sizeof(vis)) ;
printf("%d\n",require(,*n,) );
}
int main()
{
scanf("%d",&c) ;
for(int i = ; i <= c ; i++)
{
Init() ;
solve() ;
}
return ;
}
POJ 2528 Mayor's posters(线段树)的更多相关文章
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)
POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...
- poj 2528 Mayor's posters 线段树+离散化技巧
poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...
- poj 2528 Mayor's posters 线段树区间更新
Mayor's posters Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=2528 Descript ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- poj 2528 Mayor's posters 线段树+离散化 || hihocode #1079 离散化
Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...
- POJ 2528 Mayor's posters (线段树)
题目链接:http://poj.org/problem?id=2528 题目大意:有一个很上的面板, 往上面贴海报, 问最后最多有多少个海报没有被完全覆盖 解题思路:将贴海报倒着想, 对于每一张海报只 ...
- poj 2528 Mayor's posters(线段树)
题目:http://poj.org/problem?id=2528 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意的, 但是必定是单位宽度的整数 ...
- POJ 2528 Mayor's posters (线段树区间更新+离散化)
题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...
- POJ 2528 Mayor's posters (线段树+离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions:75394 Accepted: 21747 ...
- POJ 2528 Mayor’s posters (线段树段替换 && 离散化)
题意 : 在墙上贴海报, n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000).求出最后还能看见多少张海报. 分析 ...
随机推荐
- iOS之layout方法-layoutSubviews、layoutIfNeeded、setNeedsLayout
下面列举下iOS layout的相关方法: layoutSubviews layoutIfNeeded setNeedsLayout setNeedsDisplay drawRect sizeThat ...
- arc项目中使用非arc文件
因为之前没有ARC机制,好多比较好的类库都是使用的非ARC,或是有些大牛还是不喜欢用ARC,封装的类也是非ARC的,想要在自己的ARC项目中使用这些非ARC类库,只需要简单的设置一下就可以了. 1.在 ...
- 转:Oracle EBS 寄售业务总结
转自:http://blog.vsharing.com/nicr/A1359214.html 总述: 须通过一揽子采购协议(BPA)明确采购方与供应商之间的寄售关系,及各种协议条款: 通过来源补充规则 ...
- JVM工作原理和特点
操作系统装入JVM,是通过jdk中的java.exe来完成,通过以下4个步骤: 1. 创建JVM装载环境和配置: JVM装入系统,JVM提供的方式是操作系统的动态链接文件.文件就是一个装入路径的问题, ...
- Python解释器运行成功,命令运行显示无此属性解决办法
情况1: 查看出错的地方的Import包,看本程序是否有名字与import名称相同的py文件或者pyd文件. 有的话删除或者更名即可.
- ffmpeg之yuv2rgb_c_24_rgb
YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, ) LOADCHROMA(); PUTRGB24(dst_1, py_1, ); PUTRGB24(dst_2, py_2 ...
- 高级Magento模型 EAV
我们讲过Magento有两种模型,简单模型和EAV(Entity Attribute Value)模型.上一章我们讲过所有的Magento模型都是继承自Mage_Core_Model_Abstract ...
- 20160427Struts2--入门1
参考资料来自传智播客:非原创,只是做个笔记: 一.Struts2简介: Struts2是在WebWork2基础发展而来的.和struts1一样, Struts2也属于MVC框架.不过有一点大家需要注意 ...
- 在VM虚拟机中安装centos7
- Eclipse中绑定java源代码
如何在Eclipse sdk中查看jar源代码如:*.jar 1.点 “window”-> "Preferences" -> "Java" -&g ...