首页 > 其他分享 >【学习笔记】扫描线

【学习笔记】扫描线

时间:2023-07-26 20:36:18浏览次数:48  
标签:覆盖 线段 笔记 学习 扫描线 区间 长度 矩形

【别急,我也不会,没写完】

目录

定义:

如图:

(图片来源:oiwiki)

像这样的一条线在图上扫描时,便是扫描线。

(呃呃和没说没有任何区别呢)

因此可见扫面线往往是求矩形面积并集或周长并集的好工具,当然,也可以运用在二维图中。

当然它不止可以从上往下扫,还可以从左往右扫:

(当然自己画的图可能丑一些,我解释一下,那个紫色的是扫描线)

如果说我们要求这个两个矩形的并面积怎么求?

当然你可能是啊啊\(Sonnety\)真是个笨蛋呢这我直接容斥:\(S_1+S_2-S_1\times S_2\)。

但是要是数据范围很大呢?多步容斥?

这下不得不跟您谈一谈我们内存及其优秀的且很快的 \(O(nlogn)\) 算法了。

例题(解释):

我们跟着例题说这个:

题目链接

怎么求这两个矩形的面积并?

求三个小矩形面积相加嘛。

怎么求这三个矩形的面积?

宽是两条扫描线的之间的 \(x\) 差值,长是求边嘛。

我们把每条扫描线与矩形边重合部分的左右端点记录一下, \(y\) 轴高度记录一下就可以了:

\(S=\) 两条扫描线之间高度差\(\times\)扫描线覆盖长度

如何维护 \(x\) 长度?

选择桶来维护扫描线上的 \(x\) 是否被覆盖,显然是有很多问题的:

  • Q:如果 \(x\) 不一定是非负整数?

  • A:如果 \(x\) 是浮点数或者较大(甚至不是非负数),我们需要选择离散化,使得下标对应实际的 \(x\)。

  • Q:时间复杂度?

  • A:线段树优化。

  • Q:空间复杂度?

  • A:存储左右端点的 \(x\) 坐标。

什么什么什么,等等,线段树优化?

为什么能够线段树优化?

我们把每一条垂直于 \(x\) 轴的竖边提取出来,然后把他们延伸到 \(y\) 轴上,你看,这不就把 \(y\) 轴分割成了线段?

因此,我们设 \([1,2]\) 是我们第一个被切割出的长方形横边长度,以此类推,\([l,r]\) 就是我们需要维护的区间:

  • 区间的左右端点 \(l,r\)。

  • 区间被覆盖的次数。

  • 区间被横边覆盖的长度。

首先,当我们遇到一个横边的时候,区间就肯定被覆盖了至少 \(1\) 次。

其次,该区间被整体覆盖,覆盖的长度即区间长度。

最后,我们统计线段树根节点的长度标记,乘两条横边之间高度差就得到了一部分的面积。

标签:覆盖,线段,笔记,学习,扫描线,区间,长度,矩形
From: https://www.cnblogs.com/sonnety-v0cali0d-kksk/p/17583478.html

相关文章

  • Python学习4
    Python学习(二)1Python集合1.1集合(Set)集合是无序和无索引的集合。在Python中,集合用花括号编写。1.2访问项目您无法通过引用索引来访问set中的项目,因为set是无序的,项目没有索引。但是您可以使用for循环遍历set项目,或者使用in关键字查询集合中是否存在指定值。......
  • c++学习:封装、继承、多态
    c++是面向对象的编程语言,相对于c具有封装、继承、多态的特点。封装定义:封装就是将对象的属性和行为封装起来,形成一个有机的整体,其载体就是类。类通常对客户隐藏其实现细节,这就是封装的思想,就比如我们使用一个库函数时,我们只需要知道它的作用就可以了,没必要去了解它的内部工......
  • [笔记] Redis 基本操作
    redis基本操作......
  • Docker学习路线12:开发者体验
    到目前为止,我们只讨论了使用Docker来部署应用程序。然而,Docker也是一个极好的用于开发应用程序的工具。可以采用一些不同的建议来改善开发体验。在应用程序中使用docker-compose以方便开发。使用绑定挂载将本地代码挂载到容器文件系统中,以避免每次更改都需要重新构建容器映像。......
  • [百紫祭] 洛谷P5840做题笔记
    [百紫祭]洛谷P5840做题笔记luogu传送门前置芝士:AC自动机,树上差分,树剖求LCA,树状数组。前言一篇笔记需要一张头图。题意给出\(n\)个字符串\(S_1,S_2\.\.\.\S_n\)和一个初始为空的字符串集合\(T\),接下来\(q\)次操作。操作分为修改和询问。修改操作为向\(T\)中......
  • c++学习:程字辈(进程、线程、协程)
    程字辈(进程、线程、协程)介绍C++中的进程、线程、协程之间的联系及区别。(以linux下实现为例)进程概念:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来......
  • String类|笔记1(复习)
    由于字符串应用广泛,Java中专门提供了面向字符串对象的String类。1、字符串常用的构造方法 2、String对象的比较在讨论String对象的比较时,先看看String类的引用机制。创建对象S1,S2,S3,虚拟机栈中分别存储指向堆区的引用对象的地址,S1和S3指向相同的引用对象,S3指向不同的引用对象......
  • AOP的学习-入门
    切面(Aspect)用来绑定通知(Advice)也就是日志和增强对方法-切入点(Pointcut)开发案例思路: 其中主要的是定义通知类后需要在类中写切入方法和通知方法  其中切入点表达式的格式  基本格式为表示在该类中所有方法, ......
  • Cache学习(五)(六)
    上一章小结:从头创建类,必须有Row_ID这一列,不用写在方法中,选择时重命名即可。没有创建storage时,数据存储至默认storage中。 索引查询遍历   常见变量       0.26.36cache6 ......
  • 常见 DP 模型学习笔记
    一些经典的DP类型。I.数位DP数位DP归在此处,无论是高位往低位还是低位往高位。需要注意数位DP的本质是一种按位比较的贪心思想,因而可以加以扩展。I.[CQOI2013]二进制A+B最后判无解试了很多次才判成功……主要是因为“\(a,b,c\leq2^{30}\)中有个\(\leq\)而不是\(<\)就很......