传送门

•题意

  给你 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. [java]java构造器 标签: java面向对象 2017-06-11 11:16 195人阅读 评论(12)

    构造器这个概念,各种语言都有出现,虽然为了考试或者其他学了好多遍,但是自己一直不能理解这个概念,前几天又学了一遍,突然就明白了,下面随小编来一起学习一下吧. 什么是构造器? 在类别基础的面向对象程序设 ...

  2. 小爬爬5:scrapy介绍2

    1.scrapy:爬虫框架 -框架:集成了很多功能且具有很强通用性的一个项目模板 -如何学习框架:(重点:知道有哪些模块,会用就行) -学习框架的功能模板的具体使用. 功能:(1)异步爬取(自带buf ...

  3. Java中的TreeMap及红黑树

    TreeMap: http://blog.csdn.net/tobeandnottobe/article/details/7232664 红黑树: http://blog.chinaunix.net/ ...

  4. jmeter进行的接口测试和压力测试

    1.接口测试 接口测试的内容我们之前已经讲过,values-key形式和json串传参形式: 包括的协议有http,webservice(soap),jdbc数据库,java请求 2.参数化 定义:把 ...

  5. WebSocket简述

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 W ...

  6. Java练习 SDUT-4303_简单的复数运算(类和对象)

    简单的复数运算(类和对象) Time Limit: 2000 ms Memory Limit: 65536 KiB Problem Description 设计一个类Complex,用于封装对复数的下 ...

  7. Kubernetes1.3新特性:新的资源回收控制器

    (一)  核心概念 在kubernetes1.3中新增了一个资源回收控制器GarbaseCollector,用这个控制器来替代kubernetes1.3中的资源回收控制器GC. 如下为kubernet ...

  8. 上传图片如何对图片进行压缩canvas

    前言:哈喽,朋友们,最近一直在马不停蹄地赶项目,很久没有写博客了.今天我们来看一下前端上传图片地时候如何对图片进行压缩 1.图片上传 我近期写项目都是使用的VUE,这里上传图片使用了Element-u ...

  9. oracle函数 months_between(d1,d2)

    [功能]:返回日期d1到日期d2之间的月数. [参数]:d1,d2 日期型 [返回]:数字 如果d1>d2,则返回正数 如果d1<d2,则返回负数 [示例] select sysdate, ...

  10. oracle函数 LOWER(c1)

    [功能]:将字符串全部转为小写 [参数]:c1,字符表达式 [返回]:字符型 [示例] SQL> select lower('AaBbCcDd')AaBbCcDd from dual; AABB ...