#P14634. [2018 KAIST RUN Fall] Voronoi Diagram Returns

[2018 KAIST RUN Fall] Voronoi Diagram Returns

Description

:::align{center}

大小为 4 的 Voronoi 图。 :::

在二维笛卡尔坐标系中,我们将非空点集 SSVoronoi 图 定义为按"该位置最接近集合 SS 中的哪个点?"这一准则划分平面的图形。更精确地说,给定非空点集 {P1,P2,,Pn}\{P_1, P_2, \cdots, P_n\} 的 Voronoi 图是一个 区域 的集合:点 KK 包含在区域 ii 中当且仅当对于所有 1jn1 \le j \le nd(Pi,K)d(Pj,K)d(P_i, K) \le d(P_j, K),其中 d(X,Y)d(X, Y) 表示点 XXYY 之间的欧几里得距离。

例如,在上图中,平面上的每个位置都根据最接近的点着色。属于单个区域的点用浅色表示该区域,而属于多个区域的点形成黑色的线和点。

有一种算法可以在 O(nlog(n))O(n \log(n)) 时间内计算 Voronoi 图,但它以非常复杂和困难而闻名。实际上,我们是宽容的出题人,因此我们设定 n2000n \leq 2000,这意味着你可以用较慢的 Voronoi 图算法解决这个任务!

在此任务中,你需要解决 Voronoi 图中的 点查询问题:在由点集 {P1,P2,,Pn}\{P_1, P_2, \cdots, P_n\} 构建的 Voronoi 图中,你需要确定点属于哪个(哪些)区域。更精确地说,你将收到 qq 个点的查询。对于每个查询点,你需要确定以下内容:

  • 如果它不包含在任何区域中,输出 NONE
  • 如果它恰好包含在一个区域中,输出 REGION X,其中 X 是该区域的索引。
  • 如果它恰好包含在两个区域中,输出 LINE X Y,其中 XYX << Y)是这两个区域的索引。
  • 如果它包含在三个或更多区域中,输出 POINT

Input Format

第一行给出构成 Voronoi 图的点的数量 nn 和查询的数量 qq3n2,0003 \le n \le 2,0001q250,0001 \le q \le 250,000)。

接下来的 nn 行中,第 ii 行给出两个整数,表示 PiP_ixxyy 坐标。这些是构成 Voronoi 图的点。所有 nn 个点都是不同的(x,y104|x|, |y| \le 10^4)。

接下来的 qq 行中,第 jj 行给出两个整数,表示 QjQ_jxxyy 坐标。对于每个点 QjQ_j,你应该确定给定点属于哪个(哪些)区域(x,y104|x|, |y| \le 10^4)。

Output Format

输出包含 qq 行。在第 jj 行,你应该输出以下之一:

  • 如果 QjQ_j 不包含在任何区域中,输出 NONE
  • 如果 QjQ_j 恰好包含在一个区域中,输出 REGION X,其中 X 是该区域的索引。
  • 如果 QjQ_j 恰好包含在两个区域中,输出 LINE X Y,其中 XYX << Y)是这两个区域的索引。
  • 如果 QjQ_j 包含在三个或更多区域中,输出 POINT
4 3
-5 0
0 5
3 4
1 -6
-2 2
0 0
2 2
LINE 1 2
POINT
REGION 3

Hint

示例图如上所示。


翻译由 DeepSeek V3 完成