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(两次扫描线) 周 ...
随机推荐
- 技巧专题3(cdq分治、整体二分等)
cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + ...
- could not insert: [com.trs.om.bean.UserLog] The user specified as a definer ('root'@'127.0.0.1') does not exist
2019-07-01 11:24:09,315 [http-8080-24] org.hibernate.util.JDBCExceptionReporter logExceptionsWARN: S ...
- win2003开启ftp
首先你要添加IIS,然后才可以启动配置FTP,步骤如下: 1.控制面板→添加或删除程序→添加/删除windows组件: 2.在弹出的windows组件向导窗口中,选择并勾选“应用程序服务器”,然后点击 ...
- python中defaultdict类
回宿舍前翻翻Codeforces的时候发现了一个有趣的代码..其实是我没这么用过 :D 这是一份417B的代码 import sys from collections import defaultdi ...
- 集合--Set&&HashSet和TreeSet
特点:元素无序,不可重复 1.添加元素 set.add("tanlei"); set.addAll(Arrays.asList(44,"磊","磊&q ...
- Python3 写的远程批量修改文件内容的脚本
一.说明: 1.利用Python的paramiko模块,调用远程的shell命令去修改相应文件. 2.有一个专用配置文件,列出服务器清单. 3.Python循环读取配置文件的服务器IP去连接它,并执行 ...
- python 异常处理技巧
- Android EditText____TextchangedListener
今天在做APP的时候有个需求: EditText 动态监听内容变化如果长度为6时(就是看是不是验证码) 判断是否正确 正确就跳到下一个Activity,但是在Activity.finish()的时候, ...
- 使用 EnumWindows 找到满足你要求的窗口 - walterlv
原文:使用 EnumWindows 找到满足你要求的窗口 - walterlv 使用 EnumWindows 找到满足你要求的窗口 2019-04-30 13:11 在 Windows 应用开发中,如 ...
- python 布尔型(bool)