扫描线
scanning line(扫描线)
1.1扫描线的思想以及在几何问题上的应用(eg1,3)
二维数点
平面上有n个点(xi,yi)。
回答q个询问,每个询问给定一个矩形[X1,X2]×[Y1,Y2],询问矩形里面有多少个点。
因为有1e9的范围,我们离散化一下,我们只关心顺序,不关心具体是多少
这里相当于只需要把原来的点的坐标离散化,查询的时候直接二分找到小于等于他的第一个坐标即可。
我们做的时候相当于y轴是扫描线扫上去,我们只需要对x轴进行离散化即可。
思想:
①扫描线+容斥
②离线

1 |
|
矩形面积并
思路:
x坐标离散化
cnt>0覆盖,cnt=0未被覆盖
用线段树记录cnt的最小值,也就是被覆盖次数的最小的段。

1 |
|
补充:矩形周长并
思路:和上一题矩形面积并思路差不多,也是用扫描线扫,不过没有面积那么好处理。对于面积,只用有覆盖的地方*高度的加和就是答案了,但是周长的话上边界不能想面积那样不管,周长的话要考虑上边界在哪是要的。
那么做法是:
对于矩形嘛,我们考虑扫两边,竖着扫再横着扫。这里以竖着扫为例。
我们竖着扫,也就是for一遍y,那么只需要对x进行离散化即可。
再建树,用来记录最小值和最小值出现的次数。
注意:我们离散化记录的是点,而线段树我们记录的线段。
也就是说记录的是[L+1,R]这一个线段,那么用lower_bound求到x1要+1。
然后开始扫描,遇到的如果是下边界,对于x1到x2这一段要cnt+1。遇到的如果是下边界的话cnt-1。那么如何统计答案呢?
我们遇到一条与扫描线平行的线段时,答案加上【(上一条覆盖的长度-这一次覆盖的长度)的绝对值】即:ans += abs(precnt-nowcnt)
这句话怎么理解呢?
我们画图理解一下…

1 |
|
1.2 扫描线在序列问题上的应用(eg2)
区间不同数之和
题意:
有
有
思路:
①思路一:
转化为二维数点问题,所有限值是两维的都可以看成二维数点。
把一个点坐标看成
因为我们对pre[]进行扫描,按pre[]的大小排序,for这pre[]这一维度进行扫描。

事件:
- 插入:modify(i,a[i])
- 查询:query(r)-query(l-1)
1 |
|
②思路二:
维护
比如对于
综上所述,我们要实现:
①区间加
②单点查询

1 |
|
2.权值线段树之字典树(eg4)
异或第k小
给
你要回答

1 |
|
3.扫描线与权值线段树的总和运用(eg5)
mex
题意:有一个长度为
你要回答
思路:权值线段树+扫描线+线段树上二分
我们利用权值线段树,从
权值线段树维护某个数最后一次出现在数组中的位置,初始所有数都没出现。
对于所有
去找到最后一次出现位置小于
注意:这里权值是
1 |
|
4.从权值角度考虑(>=x的第一个)
之前的题目大多数以下标的角度思考,本题考虑从权值角度考虑。
例题:区间lower bound查询 - 题目 - Daimayuan Online Judge
题意:
给你
l r x
,询问 中大于等于 的最小的数。
思路:考虑用扫描线。先按权值为第一优先级排序,值一样的话先插入再查询。
因为先插入的是大的数,那再查小的数时,比它大的已经全部插入了,只需要查询区间最小值即可。那么我们需要用线段树实现区间最小值查询和单点修改。
1 |
|
- Title: 扫描线
- Author: Nannan
- Created at : 2023-10-31 22:49:00
- Updated at : 2024-09-30 19:51:49
- Link: https://redefine.ohevan.com/2023/10/31/三、扫描线Scanning line/
- License: This work is licensed under CC BY-NC-SA 4.0.