例题:hdu 1828 Picture

有两种方法,不过常用的第二种,两种都说一下。

第一种:

把矩形分成横线和竖线去处理,可知是完全相同的操作,我们来讲下怎么算出横线部分,竖线部分就是照搬即可。

将横线保存在一个表中,按横线所处的竖直位置排序(升序),另外每条横线带一个标记值,原矩形的下线为1,上线为-1(对应过去就是插入线段和删除线段)

从低到高扫描横线,没扫到一条横线就能计算出一部分横线值。计算方法是算出现在总区间的被覆盖的长度,然后求出与上一次的总区间的覆盖长度的差(即相减求绝对值),因为每次添加了一条线段,如果没有没有使总区间覆盖长度发生变化,说明这条线段其实在多边形的内部,被覆盖掉了,不能计算,只要能引起总区间长度发生变化的,说明该线段不被覆盖不被包含,要计算

而竖线部分的做法是一样的,把竖线保存在一个表中,按水平位置排序(升序),每条横线带一个标记值,原矩形的左线为1,右线为-1,然后同样地操作

第二种:

上面的方法显得有点“笨”,相同的工作做了两次,可不可以只扫描一次矩形就求出答案,是可以的,但是我们要改进一下线段树节点记录的信息

每个线段树的节点要记录几个信息

1.l,r,该节点代表的线段的左右端点坐标

2.lp,rp,是一个标记量,只有0,1,表示这个节点左右两个端点没有被覆盖,有为1,无为0

3.cnt,表示这个区间被重复覆盖了几次

4.len,这个区间被覆盖的长度

5.num,这个区间被多少条线段覆盖

好像区间[0,10],被[1,2],[4,5]覆盖,那么num=2

好像区间[0,10],被[1,3][4,5]覆盖,那么num=1,因为他们刚好连在一起了

好像区间[0,10],被[1,5][2,6]覆盖,那么num=1,因为还是连起来的一段

前面的工作是相同的,把横线保存在一个表中,按竖直位置排序,然后从下往上扫描所有横线,在这个方法中,每次扫描一条横线,都能计算出两不部分值,一部分是横线的,一部分是竖线的

而计算横线部分的方法和第一种方法是一样的,即求出【现在这次总区间被覆盖的长度和上一次总区间被覆盖的长度的差的绝对值】,另外怎么算竖线部分呢?首先我们要知道添加了这条横线后会有多少条竖线,答案是2*num,所以为什么要记录num呢,因为总区间被num条线段覆盖,那么必定有2*num的端点,这些端点其实就是连着竖线,那么这些竖线的长度是多少呢?

就是【下一条横线的高度-现在这条横线的高度】,只要把这个高度乘上2*num即可

转载于:https://www.cnblogs.com/scau20110726/archive/2013/04/13/3018687.html

线段树辅助——扫描线法计算矩形周长并(轮廓线)相关推荐

  1. 线段树辅助——扫描线法计算矩形面积并

    线段树辅助--扫描线法计算矩形面积并 本篇文章转自:传送门 分析: 1.矩形比较多,坐标也很大,所以横坐标需要离散化(纵坐标不需要),熟悉离散化后这个步骤不难,所以这里不详细讲解了,不明白的还请百度 ...

  2. HDU 1828 线段树之扫描线之周长并

    点击打开链接 题意:给n个矩形,求它们重叠后的周长 思路:用线段树的扫描线从下到上扫一遍,与面积并思想有些相似面积并,下面重边的处理相似,但是周长的并需要求的是竖边的个数然后乘以高度,而面积并求的是底 ...

  3. 【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

    [POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  4. 龙贝格方法计算椭圆周长

    龙贝格方法计算椭圆周长 椭圆周长定积分公式 由于椭圆的周长可以看作是很多Δx\Delta xΔx与Δy\Delta yΔy直角边构成的斜边的和.因此就是dx2+dy2\sqrt{dx^2+dy^2}d ...

  5. POJ1151 Atlantis(线段树,扫描线,离散化,矩形面积并)

    题目: Atlantis Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23220 Accepted: 8657 Descrip ...

  6. poj 1177 线段树+离散化+扫描线 求矩形并的轮廓长

    Picture 题意:求矩形面积并额轮廓长 解法:扫描线+离散化+线段树 做法:等于更新操作前后的tree[1].len差,做法这么巧妙实际我也不知道为什么.差不多的意思就是更新操作的cover变化长 ...

  7. 线段树区间扫描线超详解,一篇文章搞懂扫描线

    怨念 这个专题其实不难,但是翻了一圈网上的博客,写得是云里雾里,我打算用一篇博客把它讲明白 前序知识 能看懂这篇文章需要: 线段树基础知识. 线段树染色问题基本概念. 离散化操作 目标 首先这个扫描线 ...

  8. 蓝桥杯 油漆面积【第八届】【省赛】【A组】线段树扫面线/求矩形相交面积/模拟

    资源限制 内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s X星球的一批考古机器人正在一片废墟上考古. 该区域的地面坚硬如 ...

  9. HDU 1542 Atlantis 线段树+离散化+扫描线

    题意:给出一些矩形的最上角坐标和右下角坐标,求这些矩形的面积并. NotOnlySuccess 线段树专辑中扫描线模板题,弱智的我对着大大的代码看了一下午才搞懂. 具体见思路见注释=.= #inclu ...

  10. Java 计算矩形周长和面积

    java的学习 类与对象 题目要求: (1)创建Rectangle类,添加属性width.height: (2)在Rectangle类中添加两种方法计算矩形的面积和周长: (3)编程利用Rectang ...

最新文章

  1. java如何访问局域网共享文件
  2. python读取配置文件存在某配置_Python读取配置文件(config.ini)以及写入配置文件
  3. mysql基于时间盲注_MYSQL基于时间的盲注详解
  4. 网络营销外包浅析B站破圈运营是如何增强网络营销能力的?
  5. php+sqlrelay+mysql实现连接池及读写负载均衡
  6. spring的各种注解的作用-持续更新中
  7. 我的第一个python web开发框架(11)——工具函数包说明(二)
  8. java mysql 配置_Java连接MySQL数据库详细分析
  9. 等离子切割机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  10. Go语言的goroutine
  11. 在HTTPS安全页面中加载HTTP不安全的内容,如何绕过安全警告?
  12. linux内核驱动摄像头图片,详解linux 摄像头驱动编写
  13. Radius协议简单介绍
  14. instsrv+srvany 程序以服务方式自启 bat脚本快速配置
  15. php挂马检测工具,网站挂马检测工具,网站被挂马在线检测工具 | 帮助信息-动天数据...
  16. 使用Apache架设代理服务器
  17. Vufroia相机对焦问题
  18. (六十五)Android O StartService的 anr timeout 流程分析
  19. GNSS中DCB的使用
  20. hud 1560 DNA sequence(IDA* 迭代加深搜索+估值函数)

热门文章

  1. MySQL创始人发邮件寻求中国帮助
  2. 在Virtual Machine上运行Hello China的方法和工具
  3. zend framework入门教程实践
  4. Machine Learning and Data Science 教授大师
  5. MVC中页面的传值方式总结
  6. [国嵌攻略][068][tftp网络协议实现]
  7. Android Media Playback 中的MediaPlayer的用法及注意事项(一)
  8. Spring Aop技术原理分析
  9. delphi 读写文本文件
  10. SURF源码分析之fasthessian.h和fasthessian.cpp