#P15886. [Roi2023 Regional]彩色点

    ID: 15097 传统题 2000ms 512MiB 尝试: 1 已通过: 1 难度: 9 上传者: 标签>计算几何图论算法基础排序搜索DFSCF2700

[Roi2023 Regional]彩色点

题目描述

平面上有 nn 个点,编号为 11nn,分别记为

P1,P2,,Pn,P_1,P_2,\ldots,P_n,

ii 个点的坐标为 (xi,yi)(x_i,y_i)

考虑如下过程。首先选择一个起始点编号 ii 和一个在它之后的下一点编号 jj,其中 iji\ne j,同时给定一个整数 tt。接下来按下面的算法确定一个目标点编号 kk

考虑从点 PiP_i 指向点 PjP_j 的向量 PiPj\overrightarrow{P_iP_j}。把这个向量平移到以点 PjP_j 为起点。然后将除第 jj 个点以外的所有点排序:排序关键字为从这个平移后的向量方向开始,逆时针旋转到对应点方向所经过的角度;若角度相同,则按到点 PjP_j 的距离从小到大排序。

在上述排序中,按从 11 开始编号,第 tt 个点被选为目标点 PkP_k

随后,点 PjP_j 变成新的起始点,点 PkP_k 变成新的下一点,再按照同样的规则计算新的目标点。这个过程无限重复。

为了更好地理解这个过程,考虑如下例子。假设有 66 个点,如图 1 所示,且 t=4t=4。如果起始点是 P1P_1,下一点是 P2P_2,则把向量 P1P2\overrightarrow{P_1P_2} 平移到点 P2P_2,再从该方向开始逆时针排序所有除 P2P_2 外的点。图 2 中虚线表示平移后的向量,同时画出了从 P2P_2 指向其他点的向量。

图 1、图 2:六个点的例子,以及从 P2P_2 出发的排序过程

这些点的顺序为:

P3,P5,P1,P6,P4.P_3, P_5, P_1, P_6, P_4.

因此第 44 个点是 P6P_6,目标点编号为 66。接下来点 P2P_2 变成新的起始点,点 P6P_6 变成新的下一点。

图 3 展示了起始点为 P2P_2、下一点为 P6P_6 时的过程。此时排序结果为:

P4,P3,P2,P1,P5.P_4, P_3, P_2, P_1, P_5.

注意,点 P1P_1 排在点 P5P_5 之前,是因为二者方向角相同,而 P1P_1P6P_6 的距离小于 P5P_5P6P_6 的距离。因此目标点为 P1P_1

图 4 展示了起始点为 P6P_6、下一点为 P1P_1 时的过程。注意,这时平移到 P1P_1 的向量 P6P1\overrightarrow{P_6P_1} 与从 P1P_1 指向 P5P_5 的向量 P1P5\overrightarrow{P_1P_5} 方向相同,图中用实线表示。此时排序结果为:

P5,P6,P4,P2,P3.P_5, P_6, P_4, P_2, P_3.

因此目标点为 P2P_2。接下来过程又会回到“起始点为 P1P_1、下一点为 P2P_2”的状态,于是进入循环。

P2P6P_2\to P_6P6P1P_6\to P_1 开始的过程

现在需要把每个点染成三种颜色之一。第 ii 个点的颜色按如下规则确定:

  • 如果存在某个点 jj,使得选择点 PiP_i 作为起始点、点 PjP_j 作为下一点后,在上述无限过程中,点 PiP_i 会作为起始点出现无限多次,则点 PiP_i 染成绿色
  • 如果点 PiP_i 没有被染成绿色,并且存在某个点 jj,使得选择点 PiP_i 作为起始点、点 PjP_j 作为下一点后,在上述过程中,点 PiP_i 还会至少再作为起始点出现一次,则点 PiP_i 染成蓝色
  • 如果点 PiP_i 既不是绿色也不是蓝色,则染成红色

请确定每个点应该染成什么颜色。

输入格式

第一行包含两个整数 n,tn,t

接下来 nn 行,每行包含两个整数 xi,yix_i,y_i,表示第 ii 个点的坐标。

输出格式

输出一个长度为 nn 的字符串。第 ii 个字符表示第 ii 个点的颜色:

  • 若第 ii 个点为绿色,输出 G
  • 若第 ii 个点为蓝色,输出 B
  • 若第 ii 个点为红色,输出 R

数据范围

2n1000,2\le n\le 1000, 1tn1,1\le t\le n-1, 109xi,yi109.-10^9\le x_i,y_i\le 10^9.

保证任意两个点不重合。

子任务

每个子任务的分数只有在该子任务及其所有依赖子任务全部通过时才会获得。

子任务 分值 附加限制 依赖子任务 评测信息
1 10 n10n\le 10,所有点都在同一直线上 第一处错误
2 15 所有点都在同一直线上 1
3 10 n10n\le 10,保证没有蓝色点
4 n10n\le 10 1, 3
5 15 n100n\le 100,保证没有蓝色点 3
6 n100n\le 100 1, 3, 4, 5
7 5 n3n\ge 3,所有点都是严格凸多边形的顶点,并按逆时针顺序给出
8 20 1-7

样例 1

输入

6 4
-1 -1
1 -2
4 -2
2 -4
2 3
-4 -5

输出

GGBBRG

样例 2

输入

2 1
1 1
2 2

输出

GG

样例说明

考虑样例 1 中的一些点。

P1P_1 是绿色点,因为可以选择点 P2P_2 作为下一点,之后过程会无限次访问以 P1P_1 为起始点的状态。这个例子已经在题面前面的说明中展示。

可以证明点 P3P_3 不是绿色点,但它是蓝色点。因为可以选择点 P1P_1 作为下一点,之后点 P3P_3 会至少再作为起始点出现一次。从起始点 P3P_3、下一点 P1P_1 开始的过程如图 5、图 6、图 7 所示。

当起始点为 P3P_3、下一点为 P1P_1 时,排序结果为:

P6,P4,P2,P3,P5.P_6, P_4, P_2, P_3, P_5.

因此点 P3P_3 成为目标点。接下来起始点为 P1P_1、下一点为 P3P_3,排序结果为:

P5,P1,P2,P6,P4.P_5, P_1, P_2, P_6, P_4.

因此点 P6P_6 成为目标点。最后起始点为 P3P_3、下一点为 P6P_6,排序结果为:

P4,P3,P2,P1,P5.P_4, P_3, P_2, P_1, P_5.

因此点 P1P_1 成为目标点。接下来过程会继续到起始点为 P6P_6、下一点为 P1P_1 的状态。根据题面前面的例子可知,过程随后会进入循环,并不断访问编号为 6,1,26,1,2 的点。

样例 1 中说明点 P3P_3 为蓝色的过程

在样例 2 中,容易看出:无论选哪个点作为起始点、另一个点作为下一点,目标点都会变成原来的起始点。因此两个点都是绿色。