#P14700. [Bulgarian2018]Bugs

[Bulgarian2018]Bugs

题目描述

平面上有 N 只虫子,其中 N >= 3
它们位于 N 个不同的点上,且任意三只虫子都不共线。虫子的编号为 1N

虫子可以进行如下“跳跃”:

设虫子 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 <= N
  • 1 <= j <= N
  • i != j

若第 k + 1 行输出的是 i j,则表示第 k 次操作为“虫子 i 跳过虫子 j”。

评分说明

如果你的输出方案能实现某个配置 X(其中 XABC),并且虫子实际上无法实现比 X 更高的目标,那么该测试点得 100% 分。

如果虫子其实还能实现更高等级的目标,但你的方案只达成了较低目标,则会按下表给该测试点的部分分:

你输出方案达到的配置 实际上可以达到的更高配置 得分比例
A B 80%
C 70%
B 90%

如果实际上三种目标都无法实现,而你的输出为 None,则该测试点得 100% 分。
其它所有情况,该测试点得 0 分。

数据范围

  • 3 <= N <= 100
  • 0 <= 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_3
  • P_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% 分。