Loading docs/geometry/scanning.md +11 −13 Original line number Diff line number Diff line ### 简介 ## 简介 扫描线一般运用在图形上面,它和它的字面意思十分相似,就是一条线在整个图上扫来扫去,它一般被用来解决图形面积,周长等问题。 ### Atlantis问题 ## Atlantis问题 #### 题意 ### 题意 在二维坐标系上,给出多个矩形的左下以及右上坐标,求出所有矩形构成的图形的面积。 #### 解法 ### 解法 根据图片可知总面积可以直接暴力即可求出面积,如果数据大了怎么办?这时就需要讲到**扫描线**算法。 #### 流程 ### 流程 现在假设我们有一根线,从下往上开始扫描: Loading @@ -20,7 +20,7 @@     Loading @@ -30,14 +30,12 @@  - 如图所示,我们可以把整个矩形分成如图各个颜色不同的小矩形,那么这个小矩形的高就是我们扫过的距离,那么剩下了一个变量,那就是矩形的长一直在变化。 - 我们的线段树就是为了维护矩形的长,我们给每一个矩形的上下边进行标记,下面的边标记为1,上面的边标记为-1,每遇到一个矩形时,我们知道了标记为$1$的边,我们就加进来这一条矩形的长,等到扫描到-1时,证明这一条边需要删除,就删去,利用$1$和$-1$可以轻松的到这种状态。 - 还要注意这里的线段树指的并不是线段的一个端点,而指的是一个区间,所以我们要计算的时候$r+1$和$r-1$ - 我们的线段树就是为了维护矩形的长,我们给每一个矩形的上下边进行标记,下面的边标记为 1,上面的边标记为 -1,每遇到一个矩形时,我们知道了标记为 1 的边,我们就加进来这一条矩形的长,等到扫描到 -1 时,证明这一条边需要删除,就删去,利用 1 和 -1 可以轻松的到这种状态。 - 还要注意这里的线段树指的并不是线段的一个端点,而指的是一个区间,所以我们要计算的是 $r+1$ 和 $r-1$。 - 再提一下离散化,离散化就是把一段很大的区间映射到一个小区间内,这样会节省大量空间,要进行离散化,我们先对端点进行排序,然后去重,然后二分找值就可以了 #### 代码 ### 代码 ```cpp #include <cstdio> Loading Loading @@ -137,7 +135,7 @@ int main() { } ``` ### 练习 ## 练习 - [「HDU1542」 Atlantis](http://acm.hdu.edu.cn/showproblem.php?pid=1542) Loading @@ -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> Loading Loading
docs/geometry/scanning.md +11 −13 Original line number Diff line number Diff line ### 简介 ## 简介 扫描线一般运用在图形上面,它和它的字面意思十分相似,就是一条线在整个图上扫来扫去,它一般被用来解决图形面积,周长等问题。 ### Atlantis问题 ## Atlantis问题 #### 题意 ### 题意 在二维坐标系上,给出多个矩形的左下以及右上坐标,求出所有矩形构成的图形的面积。 #### 解法 ### 解法 根据图片可知总面积可以直接暴力即可求出面积,如果数据大了怎么办?这时就需要讲到**扫描线**算法。 #### 流程 ### 流程 现在假设我们有一根线,从下往上开始扫描: Loading @@ -20,7 +20,7 @@     Loading @@ -30,14 +30,12 @@  - 如图所示,我们可以把整个矩形分成如图各个颜色不同的小矩形,那么这个小矩形的高就是我们扫过的距离,那么剩下了一个变量,那就是矩形的长一直在变化。 - 我们的线段树就是为了维护矩形的长,我们给每一个矩形的上下边进行标记,下面的边标记为1,上面的边标记为-1,每遇到一个矩形时,我们知道了标记为$1$的边,我们就加进来这一条矩形的长,等到扫描到-1时,证明这一条边需要删除,就删去,利用$1$和$-1$可以轻松的到这种状态。 - 还要注意这里的线段树指的并不是线段的一个端点,而指的是一个区间,所以我们要计算的时候$r+1$和$r-1$ - 我们的线段树就是为了维护矩形的长,我们给每一个矩形的上下边进行标记,下面的边标记为 1,上面的边标记为 -1,每遇到一个矩形时,我们知道了标记为 1 的边,我们就加进来这一条矩形的长,等到扫描到 -1 时,证明这一条边需要删除,就删去,利用 1 和 -1 可以轻松的到这种状态。 - 还要注意这里的线段树指的并不是线段的一个端点,而指的是一个区间,所以我们要计算的是 $r+1$ 和 $r-1$。 - 再提一下离散化,离散化就是把一段很大的区间映射到一个小区间内,这样会节省大量空间,要进行离散化,我们先对端点进行排序,然后去重,然后二分找值就可以了 #### 代码 ### 代码 ```cpp #include <cstdio> Loading Loading @@ -137,7 +135,7 @@ int main() { } ``` ### 练习 ## 练习 - [「HDU1542」 Atlantis](http://acm.hdu.edu.cn/showproblem.php?pid=1542) Loading @@ -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> Loading