3.2 acwing.1228. 油漆面积(困难)
第八届蓝桥杯省赛C++A组,第八届蓝桥杯省赛JAVAA组
1 | X星球的一批考古机器人正在一片废墟上考古。 |
思路:
蓝桥杯压轴题,考察线段树、扫描线。
参考资料:https://oi-wiki.org/geometry/scanning/。
线段树的一个特例,很少见的应用。
题解1:暴力法。acwing过5个数据,一半,TLE,蓝桥杯OJ可以过。用boolean处理比int稍好一些。
参考代码:https://blog.csdn.net/qq_43515011/article/details/87926698。
1 | import java.util.*; |
题解2:扫描线+线段树。这题太劝退了。
扫描线一般运用在图形上面,它和它的字面意思十分相似,就是一条线在整个图上扫来扫去,它一般被用来解
决图形面积,周长等问题。本题就是一个求矩形面积并问题。扫描线属于计算几何的知识。
参考视频:https://www.bilibili.com/video/BV1yo4y197Zd。
参考资料:https://blog.csdn.net/tomorrowtodie/article/details/52048323。
扫描线图示:有一条扫描线从左往右扫描。
扫描线问题的两种类型:
- 数据量大:需要通过线段树由O(n^2)优化到O(n*logn)
- 矩形是斜着摆的,包含三角形、圆形等:计算几何,公式复杂,需要自己推
构建一个”非常特殊“的线段树,维护的是矩形纵坐标区间的有效长度。
1 | struct Node{ |
我们用扫描线去扫描每一条边的时候,都需要更新线段树的有效长度。
是如何更新的呢?
如果扫到的这条边是某矩形的入边,这段高度的矩形开始覆盖,覆盖次数cnt+1,则往区间插入这条线段。
如果扫到的这条边是某矩形的出边,这段高度的矩形结束覆盖,覆盖次数cnt-1,则往区间删除这条线段。
细节问题:要将区间转化为点。
C++版本:
1 |
|
Java版本:
1 | import java.io.BufferedReader; |