传送门

•题意

  给你 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

  HDU1542.cpp

HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)的更多相关文章

  1. hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. hdu 1542(线段树+扫描线 求矩形相交面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  3. HDU 1542 - Atlantis - [线段树+扫描线]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  4. hdu 1542 Atlantis (线段树扫描线)

    大意: 求矩形面积并. 枚举$x$坐标, 线段树维护$[y_1,y_2]$内的边是否被覆盖, 线段树维护边时需要将每条边挂在左端点上. #include <iostream> #inclu ...

  5. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  6. HDU 1542 Atlantis (线段树 + 扫描线 + 离散化)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. hdu1828 线段树扫描线求矩形面积的周长

    题意:       给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路:       线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...

  8. 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交

    E - 秋实大哥与家 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...

  9. HDU 1828“Picture”(线段树+扫描线求矩形周长并)

    传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...

随机推荐

  1. 技巧专题3(cdq分治、整体二分等)

    cdq分治与整体二分 cdq来源于2008年国家集训队作业陈丹琦(雅礼巨佬),用一个log的代价完成从静态到动态(很多时候是减少时间那一维的). 对于一个时间段[L, R],我们取mid = (L + ...

  2. 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 ...

  3. win2003开启ftp

    首先你要添加IIS,然后才可以启动配置FTP,步骤如下: 1.控制面板→添加或删除程序→添加/删除windows组件: 2.在弹出的windows组件向导窗口中,选择并勾选“应用程序服务器”,然后点击 ...

  4. python中defaultdict类

    回宿舍前翻翻Codeforces的时候发现了一个有趣的代码..其实是我没这么用过 :D 这是一份417B的代码 import sys from collections import defaultdi ...

  5. 集合--Set&&HashSet和TreeSet

    特点:元素无序,不可重复 1.添加元素 set.add("tanlei"); set.addAll(Arrays.asList(44,"磊","磊&q ...

  6. Python3 写的远程批量修改文件内容的脚本

    一.说明: 1.利用Python的paramiko模块,调用远程的shell命令去修改相应文件. 2.有一个专用配置文件,列出服务器清单. 3.Python循环读取配置文件的服务器IP去连接它,并执行 ...

  7. python 异常处理技巧

  8. Android EditText____TextchangedListener

    今天在做APP的时候有个需求: EditText 动态监听内容变化如果长度为6时(就是看是不是验证码) 判断是否正确 正确就跳到下一个Activity,但是在Activity.finish()的时候, ...

  9. 使用 EnumWindows 找到满足你要求的窗口 - walterlv

    原文:使用 EnumWindows 找到满足你要求的窗口 - walterlv 使用 EnumWindows 找到满足你要求的窗口 2019-04-30 13:11 在 Windows 应用开发中,如 ...

  10. python 布尔型(bool)