CF1903E Geo Game

题目描述

这是一个交互题。 Theofanis 和他的妹妹正在玩如下的游戏。 他们在二维平面上有 $n$ 个点,以及一个起始点 $(s_x, s_y)$。每位玩家(从第一位玩家开始)轮流选择一个之前未被选择过的 $n$ 个点中的一个,并将从上一个点(即起始点或对方刚刚选择的点)到当前玩家选择的新点的欧几里得距离的平方加到总和(初始为 $0$)上。 游戏在恰好 $n$ 步后结束(所有点都被选完)。如果最后总和是偶数,则第一位玩家获胜;否则,第二位玩家获胜。 Theofanis 非常好胜,他讨厌输掉比赛。因此,他想决定自己应该先手还是后手。你能告诉他应该选择哪一位玩家,并且如何操作才能战胜他的妹妹吗?

输入格式

第一行包含一个整数 $t$($1 \le t \le 2000$),表示测试用例的数量。 每个测试用例的数据仅在所有前一个测试用例的交互(即游戏结束)后才可获得。 每个测试用例的第一行包含一个整数 $n$($1 \le n \le 10^{5}$),表示点的数量。 第二行包含两个整数 $s_x, s_y$($0 \le s_x, s_y \le 10^{9}$),表示起始点的坐标。 接下来的 $n$ 行中,第 $i$ 行包含两个整数 $x_i, y_i$($0 \le x_i, y_i \le 10^{9}$),表示第 $i$ 个点的坐标。 保证所有测试用例中 $n$ 的总和不超过 $10^{5}$。

输出格式

对于每个测试用例,你应首先输出你想扮演的玩家(First 或 Second)。 然后,你需要进行游戏。当轮到你时,输出你选择的点的编号 $j$($1 \le j \le n$);当轮到对方时,读取对方选择的编号。 当所有回合结束后,继续读取下一个测试用例的输入,或者如果没有更多测试用例则结束程序。 如果你收到 $-1$ 作为编号或 $n$ 的值,说明你的程序在上一个测试用例中做出了无效操作或已经输掉比赛。你的程序必须立即终止,否则会收到 Wrong Answer 判定。否则,如果你的程序继续从已关闭的流中读取数据,可能会得到任意判定。 每次输出选择玩家或回合操作后,别忘了输出换行并刷新输出缓冲区,否则会收到 Idleness limit exceeded 的判定。具体做法如下: - C++:使用 fflush(stdout) 或 cout.flush(); - Java:使用 System.out.flush(); - Pascal:使用 flush(output); - Python:使用 stdout.flush(); - 其他语言请查阅相关文档。 Hack 格式 Hack 时请使用如下格式。 第一行包含一个整数 $t$($1 \le t \le 2000$),表示测试用例数量。 每个测试用例的第一行包含一个整数 $n$($1 \le n \le 10^{5}$),表示点的数量。 第二行包含两个整数 $s_x, s_y$($0 \le s_x, s_y \le 10^{9}$),表示起始点的坐标。 接下来的 $n$ 行中,第 $i$ 行包含两个整数 $x_i, y_i$($0 \le x_i, y_i \le 10^{9}$),表示第 $i$ 个点的坐标。 所有测试用例中 $n$ 的总和不超过 $10^{5}$。 # 输出格式 见上文。

说明/提示

上面的示例并不一定展示了最优策略或正确的玩家选择方式。 下图展示了第一个示例中每位玩家的操作。红色为第一位玩家,黑色为第二位玩家。 ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1903E/f7249992dc1dd05fd5ad17cee8e62de0afd41f95.png) 由 ChatGPT 4.1 翻译