扫描线二维数点问题
前置知识
线段树。
扫描线
简介:能在 \(O(n\log n)\) 的时间内解决矩阵并面积问题和二维数点的算法。
矩阵并
很简单。
二维数点
现在有 \(n\) 个矩阵,左上角 \((a_i,b_i)\),右上角 \((c_i,d_i)\),这个矩阵的贡献是 \(k_i\),然后你要取 \(m\) 个点 \((x_i,y_i)\) 的贡献:

先将 \(a_i,c_i,x_i\) 这些 \(x\) 坐标和 \(y\) 坐标全丢进去离散化。
然后考虑只看每个矩阵的两个竖线:

遍历 \(x\) 坐标:
- 如果遇到一个矩阵的第一个边,将这个矩阵的那一段 \(y\) 坐标 \(+k_i\)。
- 如果遇到一个点,查询它的 \(y\) 坐标。
- 如果遇到一个矩阵的第二个边,将这个矩阵的那一段 \(y\) 坐标 \(-k_i\)。
然后做完了。
P5677 GZOI2017 配对统计
例题。
分析
先将每个数带着下标排序,设排完之后二元组是 \((a_i,id_i)\)。
对于每一个数,它的“好对”只可能是 \((a_{i-1},id_{i-1})\),以及 \((a_{i+1},id_{i+1})\)。
如果差距一样则两个都可以,否则取距离较小的一个。注意到一个好对必须满足两个数都在 \([l,r]\) 范围内。
将这些 \((a_i,a_{i+1})\) 和 \((a_{i},a_{i-1})\) 二元组看作一个点,然后题目变为:
有 \(m\) 个矩阵,左上角 \((l_i,l_i)\),右下角 \((r_i,r_i)\),矩阵贡献为 \(i\),求所有点的贡献和。
思路
考虑用二维数点维护一下矩阵和点即可。

浙公网安备 33010602011771号