扫描线二维数点问题

前置知识

线段树。


扫描线

简介:能在 \(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\),求所有点的贡献和。

思路

考虑用二维数点维护一下矩阵和点即可。

posted @ 2024-12-04 21:27  _E_M_T  阅读(40)  评论(0)    收藏  举报