HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)
•题意
给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标;
让你求这 n 个矩形并的面积;
其中 $x \leq 10^{5} \ ,\ y \leq 10^{5}$;
•题解
这类题的解决方法需要用到一个比较重要的算法--扫描线算法;
其实并不需要将扫描线算法学的多么透彻,此类题仅仅用到了扫描线算法的思想;
下面开始说说如何用扫描线处理这类问题;
假设你有两个矩形,如图所示;
矩形①的左下角和右上角坐标分别为:$(1.2\ ,\ 1.4),(4.5\ ,\ 3.4)$
矩形②的左下角和右上角坐标分别为:$(3.5\ ,\ 2.6),(7.6\ ,\ 4.8)$
现在,假想有一条扫描线,从上到下扫描整个多边形;
扫描线从1位置开始扫描,计算出扫描线1扫描到的矩形的长度 $line_{1}=4.5-1.2 = 3.3$;
扫描线从1位置向上扫描,来到2位置,计算出扫描线1,2扫描到的矩形面积 $area_{1}=line_{1} \times (h_2-h_1)$;
并计算出扫描线2扫描到的矩形的长度 $line_{2}=7.6-1.2=6.4$;
扫描线从2位置向上扫描,来到3位置,计算出扫描线2,3扫描到的矩形面积 $area_{2}=line_{2} \times (h_{3}-h_{2})$;
并计算出扫描线3扫描到的矩形的长度 $line_{3}=7.6-3.5=4.1$;
扫描线从3位置向上扫描,来到4位置,计算出扫描线3,4扫描到的矩形面积 $area_{3}=line_{3} \times (h_{4}-h_{3})$;
到这,就通过扫描线求出了矩形并的面积 $area=area_{1}+area_{2}+area_{3}$;
通过上述模拟,便可知道,要想用扫描线,那么,你需要做好如下准备工作:
(1)保存好矩形的上下边
(2)按照高度将保存的信息排序
那么,该如何记录呢?
我们可以用结构体来保存所有的上下边,结构定义如下:
struct Data
{
double l,r;///保存边的左右信息
double h;///保存边的高度
int f;///判断该边为所在矩形的上边还是下边,上边就赋值为-1,下边赋值为1
bool operator < (const Data &obj)const///按照边的高度升序排列
{
return h < obj.h;
}
}a[maxn<<];那么,将上述两个矩形的边存入 a 中并排好序后的信息为:
$a_{1}:\{l=1.2\ ,\ r=4.5\ ,\ h=1.4\ ,\ f=1 \}$
$a_{2}:\{l=3.5\ ,\ r=7.6\ ,\ h=2.6\ ,\ f=1 \}$
$a_{3}:\{l=1.2\ ,\ r=4.5\ ,\ h=3.4\ ,\ f=-1 \}$
$a_{4}:\{l=3.5\ ,\ r=7.6\ ,\ h=4.8\ ,\ f=-1 \}$
因为坐标较大,所以需要将横坐标离散化;
•Code
HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)的更多相关文章
- hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu 1542(线段树+扫描线 求矩形相交面积)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDU 1542 - Atlantis - [线段树+扫描线]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- hdu 1542 Atlantis (线段树扫描线)
大意: 求矩形面积并. 枚举$x$坐标, 线段树维护$[y_1,y_2]$内的边是否被覆盖, 线段树维护边时需要将每条边挂在左端点上. #include <iostream> #inclu ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu1828 线段树扫描线求矩形面积的周长
题意: 给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路: 线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...
- 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交
E - 秋实大哥与家 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...
- HDU 1828“Picture”(线段树+扫描线求矩形周长并)
传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...
随机推荐
- B站直播 DEMO ijkplayerDemo
http://blog.csdn.net/kengsir/article/details/51750879 一. 下载ijkplayer ijkplayer下载地址 下载完成后解压, 解压后文件夹内部 ...
- Leetcode705.Design HashSet设置哈希集合
不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中插入一个值. contains(value) :返回哈希集合中是否存在这个值. rem ...
- 阿里云ecs环境配置
在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境 https://ninghao.net/blog/1368 阿里云ecs从购买到环境搭建和建站!! ...
- 【转】MySQL的btree索引和hash索引的区别
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...
- 【51NOD1028】大数乘法 V2
╰( ̄▽ ̄)╭ 给出2个大整数A,B,计算A*B的结果. (A,B的长度 <= 100000,A,B >= 0) (⊙ ▽ ⊙) 把大整数A看做一个次数界为lenA的多项式A(x),其中x ...
- mysql自定义function 写递归查询子节点
#存储文本信息表 CREATE TABLE WordInfoEntity( word_id ) PRIMARY KEY NOT NULL, # 主键ID UUID word_greda :正文文本 , ...
- Convert Sorted Array to Binary Search Tree转换成平衡二查搜索树
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 二分 ...
- IDEA切换git分支
查看当前所在分支 场景:在多人开发中,需要在主分支的基础上创建一些分支分配给小团队或个人去开发,然后小分支上的小功能开发完毕之后,再merge(合并)到主分支. 1.查看当前所在的分支 下图1.1中是 ...
- MySQL命令行分号无法结束问题解决
背景:输入一串查询语句,以分号结束,发现没有结束,再打回车,分号,还是不完.什么exit,quit,bye,都不顶用如果要ctrl+C吧,又得退出mysql,一切重来,很麻烦.后来终于发现,引起这种现 ...
- 亚洲唯一,阿里云SLB位列Gartner全球网络负载均衡市场前五
近日,Gartner发布了最新的全球企业级网络设备市场份额报告“Market Share: Enterprise Network Equipment by Market Segment, Worldw ...

