#P14700. [Bulgarian2018]Bugs
[Bulgarian2018]Bugs
题目描述
平面上有 N 只虫子,其中 N >= 3。
它们位于 N 个不同的点上,且任意三只虫子都不共线。虫子的编号为 1 到 N。
虫子可以进行如下“跳跃”:
设虫子 i 当前位于点 A,虫子 j 当前位于点 B。
若虫子 i 跳过虫子 j,则跳跃结束后,虫子 i 会落到点 C,其中 B 是线段 AC 的中点。
也就是说,虫子 i 跳跃后会到达点 A 关于点 B 的中心对称点。
虫子们希望经过若干次跳跃后达到以下目标之一:
配置 C(最佳目标)
若记虫子 i 的最终位置为 P_i,则点列 P_1, P_2, ..., P_N 构成一个凸多边形,并且这些点沿多边形的顶点或边按逆时针顺序依次排列。
配置 B(次优目标)
点列 P_1, P_2, ..., P_N 构成一个凸多边形,但它们沿多边形的顶点或边按顺时针顺序依次排列。
配置 A(最弱目标)
所有虫子的最终位置只需落在某个凸多边形的顶点或边上即可,但不要求按照 P_1, P_2, ..., P_N 的顺序排列。
请编写程序 bugs,给出一组跳跃方案,使虫子达到它们能达到的最好目标;若三种目标都无法实现,则输出无法实现。
输入格式
第一行输入正整数 N。
接下来 N 行,每行两个非负整数 x_i, y_i,表示第 i 只虫子的初始坐标为 (x_i, y_i)。
输出格式
如果虫子无论如何跳跃都无法排成凸多边形,则输出一行:
None
如果能够达到某种配置,则按如下格式输出一组方案:
第一行输出一个非负整数 S,表示跳跃次数。
如果 S = 0,则输出到此结束。
如果 S > 0,则接下来的 S 行中,每行输出两个正整数 i, j,表示在该步中,虫子 i 跳过虫子 j。
要求:
1 <= i <= N1 <= j <= Ni != j
若第 k + 1 行输出的是 i j,则表示第 k 次操作为“虫子 i 跳过虫子 j”。
评分说明
如果你的输出方案能实现某个配置 X(其中 X 为 A、B 或 C),并且虫子实际上无法实现比 X 更高的目标,那么该测试点得 100% 分。
如果虫子其实还能实现更高等级的目标,但你的方案只达成了较低目标,则会按下表给该测试点的部分分:
| 你输出方案达到的配置 | 实际上可以达到的更高配置 | 得分比例 |
|---|---|---|
| A | B | 80% |
| C | 70% | |
| B | 90% |
如果实际上三种目标都无法实现,而你的输出为 None,则该测试点得 100% 分。
其它所有情况,该测试点得 0 分。
数据范围
3 <= N <= 1000 <= x_i, y_i <= 200- 初始时任意三只虫子不共线
- 在
30%的测试中,3 <= N <= 10 - 跳跃次数不得超过
30000000 - 所有虫子最终坐标的绝对值不得超过
2^31
样例
输入
6
3 5
4 3
3 1
11 4
7 7
7 2
输出 1
6
3 1
3 2
3 6
3 4
6 2
6 1
样例解释 1
题面说明如下:
P_3跳过P_1,到达P_3'P_3'跳过P_2,到达P_3''P_3''跳过P_6,到达P_3'''P_3'''跳过P_4,到达Q_3P_6跳过P_2,到达P_6'P_6'跳过P_1,到达Q_6
最终得到的“退化六边形” P_1 P_2 Q_3 P_4 P_5 Q_6(实际上是五边形,因为 P_1、Q_6、P_5 三点共线)仍然是凸的,并且虫子沿其顶点或边按逆时针顺序排列,因此实现了最佳配置 C。

输出 2
3
4 2
5 1
6 2
样例解释 2
题面还给出了另一组方案。该方案的最终位置按顺时针顺序落在一个凸四边形上,因此只能达到配置 B。
由于本题实际上存在实现配置 C 的方案,所以这种方案只能得到 90% 分。
