Unverified Commit b331b8f9 authored by Xeonacid's avatar Xeonacid Committed by GitHub
Browse files

Update scanning.md

parent 08647214
Loading
Loading
Loading
Loading
+11 −13
Original line number Diff line number Diff line
### 简介
## 简介

扫描线一般运用在图形上面,它和它的字面意思十分相似,就是一条线在整个图上扫来扫去,它一般被用来解决图形面积,周长等问题。

### Atlantis问题
## Atlantis问题

#### 题意
### 题意

在二维坐标系上,给出多个矩形的左下以及右上坐标,求出所有矩形构成的图形的面积。

#### 解法
### 解法

根据图片可知总面积可以直接暴力即可求出面积,如果数据大了怎么办?这时就需要讲到**扫描线**算法。

#### 流程
### 流程

现在假设我们有一根线,从下往上开始扫描:

@@ -20,7 +20,7 @@

![](./images/scanning-2.png)

![](./images/scanning-3.png)
![](./images/scanning-3.jpg)

![](./images/scanning-4.png)

@@ -30,14 +30,12 @@

![](./images/scanning-7.png)



- 如图所示,我们可以把整个矩形分成如图各个颜色不同的小矩形,那么这个小矩形的高就是我们扫过的距离,那么剩下了一个变量,那就是矩形的长一直在变化。
- 我们的线段树就是为了维护矩形的长,我们给每一个矩形的上下边进行标记,下面的边标记为1,上面的边标记为-1,每遇到一个矩形时,我们知道了标记为$1$的边,我们就加进来这一条矩形的长,等到扫描到-1时,证明这一条边需要删除,就删去,利用$1$和$-1$可以轻松的到这种状态。
- 还要注意这里的线段树指的并不是线段的一个端点,而指的是一个区间,所以我们要计算的时候$r+1$$r-1$
- 我们的线段树就是为了维护矩形的长,我们给每一个矩形的上下边进行标记,下面的边标记为 1,上面的边标记为 -1,每遇到一个矩形时,我们知道了标记为 1 的边,我们就加进来这一条矩形的长,等到扫描到 -1 时,证明这一条边需要删除,就删去,利用 1 和 -1 可以轻松的到这种状态。
- 还要注意这里的线段树指的并不是线段的一个端点,而指的是一个区间,所以我们要计算的$r+1$$r-1$
- 再提一下离散化,离散化就是把一段很大的区间映射到一个小区间内,这样会节省大量空间,要进行离散化,我们先对端点进行排序,然后去重,然后二分找值就可以了

#### 代码
### 代码

```cpp
#include <cstdio>
@@ -137,7 +135,7 @@ int main() {
}
```

### 练习
## 练习

- [「HDU1542」 Atlantis](http://acm.hdu.edu.cn/showproblem.php?pid=1542)

@@ -145,7 +143,7 @@ int main() {

- [「HDU3265」 Posters](http://acm.hdu.edu.cn/showproblem.php?pid=3265)

### 参考资料
## 参考资料

- <https://www.cnblogs.com/yangsongyi/p/8378629.html>