HDU 1828“Picture”(线段树+扫描线求矩形周长并)
•参考资料
•题意
给你 n 个矩形,求矩形并的周长;
•题解1(两次扫描线)
周长可以分成两部分计算,横线和竖线;
如何求解横线的所有并的长度呢?
和求矩阵面积并的做法一样,先将 x 离散化;
每次更新的时候,记录一下上次更新后的横线总长度;
ans += [现在这次总区间被覆盖的长度和上一次总区间被覆盖的长度之差的绝对值];
求解竖线的所有并的长度何求解横线的长度相同;
需要注意的是,在求解矩形面积并的时候,排序策略是按照 h 从小到大排序,并不需要考虑 h 相同的情况;
但是求矩形周长并的时候就不行了,必须得考虑 h 相同的情况下的排序策略;
以下例求解横线并的长度为例;
n=2
(2,1),(4,3)
(3,3),(4,5)
定义如下数据结构存储横线;struct Edge
{
int l,r;
int h;
int f;
bool operator < (const Edge &obj)const
{
return h < obj.h;
}
}e[maxn<<];假设与处理矩形面积并的排序策略相同,只考虑按 h 升序排列,那么排列后的数据为:
$e_{1}:\{l=2\ ,\ r=4\ ,\ h=1\ ,\ f=1 \}$
$e_{2}:\{l=2\ ,\ r=4\ ,\ h=3\ ,\ f=-1 \}$
$e_{3}:\{l=3\ ,\ r=4\ ,\ h=3\ ,\ f=1 \}$
$e_{1}:\{l=3\ ,\ r=4\ ,\ h=5\ ,\ f=-1 \}$
让我们手动模拟一下这个求解过程;
定义 ans 表示答案,len 表示当前更新后的横线并的总长度,pre 表示上一次更新后的 len 值;
初始化 ans=0,len=0,pre=0;
首先处理 $e_{1}$,update() 后,len = 2;
更新 ans += |len-pre| = 2 , pre=len=2;
处理 $e_{2}$,update() 后,len = 0;
此时,更新 ans += |len-pre| = 2+2 = 4 , pre=len=0,出现问题了是吧,因为来到此处的时候,ans=3才对;
继续向上更新, $e_{3}$,update() 后,len=1;
更新 ans += |len-pre| = 4+1 = 5 , pre=len=1;
$e_{4}$,update() 后,len=0;
更新 ans += |len-pre| = 5+1 = 6;
但是正确答案应该是 ans = 4;
多的 2 就是因为排序策略不当而产生的;
所以,当 h 相同的时候,应该先处理 f = 1 的边,即如果可以先加入边,那就优先执行加边操作;
所以,需要将 Edge 中的排序策略更改一下,改成如下模式:bool operator < (const Edge &obj)const
{
if(h != obj.h)
return h < obj.h;
return f > obj.f;
}(ps:f = 1 表示下边界,所以当 h 相同时,按照 f 降序排列)
到这,这道题就这么愉快的解决了;
•Code
HDU 1828“Picture”(线段树+扫描线求矩形周长并)的更多相关文章
- HDU 1828 Picture (线段树+扫描线)(周长并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1828 给你n个矩形,让你求出总的周长. 类似面积并,面积并是扫描一次,周长并是扫描了两次,x轴一次,y ...
- poj 1177 --- Picture(线段树+扫描线 求矩形并的周长)
题目链接 Description A number of rectangular posters, photographs and other pictures of the same shape a ...
- HDU 1828 Picture (线段树:扫描线周长)
依然是扫描线,只不过是求所有矩形覆盖之后形成的图形的周长. 容易发现,扫描线中的某一条横边对答案的贡献. 其实就是 加上/去掉这条边之前的答案 和 加上/去掉这条边之后的答案 之差的绝对值 然后横着竖 ...
- hdu 1542(线段树+扫描线 求矩形相交面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- poj 1177 Picture (线段树 扫描线 离散化 矩形周长并)
题目链接 题意:给出n个矩形,每个矩形给左下 和 右上的坐标,求围成的周长的长度. 分析: 首先感谢大神的博客,最近做题经常看大神的博客:http://www.cnblogs.com/kuangbin ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- POJ 1177/HDU 1828 picture 线段树+离散化+扫描线 轮廓周长计算
求n个图矩形放下来,有的重合有些重合一部分有些没重合,求最后总的不规则图型的轮廓长度. 我的做法是对x进行一遍扫描线,再对y做一遍同样的扫描线,相加即可.因为最后的轮廓必定是由不重合的线段长度组成的, ...
- HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)
传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...
- hdu 1828 Picture(线段树 || 普通hash标记)
http://acm.hdu.edu.cn/showproblem.php?pid=1828 Picture Time Limit: 6000/2000 MS (Java/Others) Mem ...
随机推荐
- 第一周<单元一聚类>
K-means 聚类算法 初始随机选择 而后不断更新 kmeans 应用 省份归类 调用kmeans方法所需要的参数 n_clusters 指定的聚类中心 init 初始聚类中心的初始化方法 默认k- ...
- ORACLE常用的环境变量
ORACLE_HOME:将要安装oracle软件的目录,指向oracle二进制文件应该安装到的位置. ORACLE_BASE:主机服务器上用于oracle软件的顶级目录 ORACLE_SID:定义一个 ...
- 【水滴石穿】rn_statusbar
先放项目地址https://github.com/hezhii/rn_statusbar 来看一下效果 咩有感觉很怎么样,看代码 根入口文件 //index.js //看代码我们知道入口是app.js ...
- mysql更改密码
mysql command line client输入密码以后闪退问题的解决: 网上搜到的解决办法(my.ini文件之类的修改对我都没有起到作用).. 所以觉得是自己密码的问题,因为许久不用这个软件了 ...
- vsync信号产生与分发
以下分析基于android 4.4代码 vsync信号的产生.分发涉及到以下几个类,先主要了解下他们各自的功能: HWComposer:产生hardware vsync,post fb VSyncTh ...
- Markdown 常用语法学习(stackedit)
Welcome to StackEdit!{#welcome} ===================== Hello, I am your first Markdown document withi ...
- 【Leetcode】两数之和,三数之和,四数之和
两数之和 题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这 ...
- 重温Observer模式--热水器·改
引言 在 C#中的委托和事件 一文的后半部分,讲述了Observer(观察者)模式,并使用委托和事件实现了这个模式.实际上,不使用委托和事件,一样可以实现Observer模式.在本文中,我将使用GOF ...
- 探索云数据库最佳实践 阿里云开发者大会数据库专场邀你一起Code up!
盛夏.魔都.科技 三者在一起有什么惊喜? 7月24日,阿里云峰会·上海——开发者大会将在上海世博中心盛大启程,与未来世界的开发者们分享数据库.云原生.开源大数据等领域的技术干货,共同探讨前沿科技趋势, ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十三章:计算着色器(The Compute Shader) 代码工程 ...