二维数点&扫描线
二维数点
应用于问题中最主要是数矩形点数和求点被矩形覆盖次数。
比较明显的二维数点
问题是在一个二维的平面中,这时候很容易看出来需要二维数点,所以一般就会和一些算法/数据结构结合。
与二分结合:AT_abc233_h
不明显的二维数点
二维数点是在一定的范围中求点的数量/权值和,这个范围有时需要自己通过构造不等式确定。
比如题目询问的是区间,就应该确定左右端点的范围。区间需要左右端点同时在范围内才能满足要求,可以由此构建出一个矩形。
P10550:可以确定每个产品可以贸易的区间,若一次贸易能进行,必须要被查询的区间包含才行,由此可以确定出每个贸易成立时查询区间左右端点的范围,构建矩形。
扫描线
明显
明显的扫描线,按照扫描线的规则,先定下一维再处理另一维。
Gym-102979C,AT_arc201_e
不明显
也是需要通过构建不等式来确定范围,只是最终的目的可能变成了求周长/面积并等。
AT_abc346_g:可以构建出当区间必须包含 \(i\) 时左右端点的范围,确定 \(n\) 个矩形,最后求总面积即可。
P9120:二分将问题转化成判定性问题,固定极差的情况下通过扫描线确定能否使每一位都能选。
CodeForces-1906F:扫描线可以按照任意的方向扫,这道题平行于 \(m\) 个操作向上扫可以转化成最大子段和。但是平时写题时习惯于竖着扫,没有想出来。
注意
转换成一个矩形时要注意边界的问题。比如将答案转换成面积时要将原来的一个点转换成矩形边上的一个段(AT_abc346_g)。或者是扫描线本来就维护的是点。
主要就是搞清楚维护扫描线的数据结构每个点维护的到底是什么。
浙公网安备 33010602011771号