在隆德(Lund)古镇,有一条街上有 $N$ 栋排成一行的房子,编号为 $0$ 到 $N-1$。Emma 住在其中一栋房子里,她的朋友 Anna 和 Bertil 想找出她住在哪里。Emma 决定和他们玩一个游戏,而不是直接告诉朋友她住在哪里。在游戏开始前,Anna 和 Bertil 只知道街上的房子总数。此时,Anna 和 Bertil 可以选择一个正整数 $K$ 并商定一个策略。此后禁止任何交流。
游戏分为两个阶段。在第一阶段,Emma 选择一个访问房子的顺序,使得她自己的房子是最后一个被访问的。然后,她按此顺序带领 Anna 一一参观这些房子,且不提前告知 Anna 访问顺序。对于每一栋不是 Emma 住处的房子,Anna 可以用粉笔在门上写下一个 $1$ 到 $K$ 之间的整数。对于最后一栋访问的房子(即 Emma 的住处),由 Emma 自己在门上写下一个 $1$ 到 $K$ 之间的整数。
在游戏的第二阶段,Bertil 沿着街道从 $0$ 号房子走到 $N-1$ 号房子,并读取 Anna 和 Emma 写在门上的所有数字。他现在想要猜出 Emma 住在哪里。他有两次猜测机会,如果他猜对了,他和 Anna 就赢得了游戏。否则,Emma 获胜。
你能设计一个策略,保证 Anna 和 Bertil 赢得游戏吗?你的策略将根据 $K$ 的值进行评分($K$ 越小越好)。
实现细节
这是一个多轮运行问题,意味着你的程序将被多次执行。第一次运行时,它将执行 Anna 的策略。之后,它将执行 Bertil 的策略。
输入的第一行包含两个整数 $P$ 和 $N$,其中 $P$ 为 $1$ 或 $2$(分别代表第一阶段或第二阶段),$N$ 是房子的数量。除了样例输入(不用于评分)外,$N$ 始终等于 $100\,000$。
后续输入取决于阶段:
第一阶段
你的程序应首先输出一个整数 $K$($1 \le K \le 1\,000\,000$)。 然后,程序需要读取 $N-1$ 次包含索引 $i$($0 \le i < N$)的行,并输出一行包含一个整数 $A_i$($1 \le A_i \le K$),表示 Anna 在 $i$ 号房子的门上写的数字。除了 Emma 住处的索引外,每个索引 $i$ 都会恰好出现一次,顺序由评测机决定。
第二阶段
你的程序应读取一行包含 $N$ 个整数 $A_0, A_1, \dots, A_{N-1}$ 的数据,其中 $A_i$ 是写在 $i$ 号房子门上的数字。 然后,它应打印一行包含两个整数 $s_1$ 和 $s_2$($0 \le s_i < N$),即猜测的索引。$s_1$ 和 $s_2$ 可以相等。
实现细节
注意,当程序在第二阶段运行时,程序会重新启动。这意味着你无法在两次运行之间保存变量信息。
在你打印每一行后,请确保刷新标准输出,否则你的程序可能会被判为“超出时间限制”(Time Limit Exceeded)。在 Python 中,print() 会自动刷新。在 C++ 中,cout << endl; 除了打印换行符外还会刷新缓冲区;如果使用 printf,请使用 fflush(stdout)。
本题的评测机可能是自适应的,这意味着它可能会根据你程序的输出改变其行为,以防止启发式解法通过。它可能会先试运行第一阶段,观察你的输出,然后利用从前一次运行中提取的信息进行正式的第一阶段运行。
你的程序必须是确定性的,即在相同输入下运行两次时表现一致。如果你想在程序中使用随机性,请确保使用固定的随机种子。这可以通过向 srand(C++)或 random.seed(Python)传递硬编码的常量来实现,或者如果使用 C++11 的随机数生成器,则在构造生成器时指定种子。特别地,你不能在 C++ 中使用 srand(time(NULL))。如果评测机检测到你的程序不是确定性的,它将给出“答案错误”(Wrong Answer)的判决。
如果你的程序(最多 3 次)单独运行的总时间超过了时间限制,你的提交将被判为“超出时间限制”。
子任务
你的解法将在多个测试用例上进行测试。如果你的解法在任何测试用例上失败(例如给出错误答案、崩溃、超出时间限制等),你将获得 0 分。
如果你的程序在所有测试用例中都成功找到了 Emma 的住处,你将获得“通过”(Accepted)的判决,并根据所有测试用例中使用的 $K$ 的最大值 $K_{max}$ 计算得分。得分规则如下:
| $K_{max}$ 的范围 | 得分 |
|---|---|
| $K_{max} > 99\,998$ | $10$ 分 |
| $10\,000 < K_{max} \le 99\,998$ | $10 + \lfloor 40(1 - K_{max}/10^5) \rfloor$ 分 |
| $30 < K_{max} \le 10\,000$ | $46 + \lfloor 31(4 - \log_{10}(K_{max}))/(4 - \log_{10}(30)) \rfloor$ 分 |
| $7 < K_{max} \le 30$ | $107 - K_{max}$ 分 |
| $K_{max} \le 7$ | $100$ 分 |
评分函数如下图所示:
样例测试用例不计入评分,你的解法不需要通过样例。
样例
样例输入 1
1 4 2 0 3 1
样例输出 1
3 3 1 2
样例输入 2
2 4 1 2 3 2
样例输出 2
1 3
说明
样例交互过程: 假设 $N=4$,Emma 住在 1 号房子。令 $A$ 为写在房子上的数字列表。初始时 $A = [0, 0, 0, 0]$,其中 $0$ 表示对应房子上没有写数字。
在代码的第一次运行中: 给定 $N=4$。你的程序响应 $K=3$。 询问 $A_2$。你的程序响应 $3$。此时 $A = [0, 0, 3, 0]$。 询问 $A_0$。你的程序响应 $1$。此时 $A = [1, 0, 3, 0]$。 询问 $A_3$。你的程序响应 $2$。此时 $A = [1, 0, 3, 2]$。 最后,评测机设置 $A_1 = 2$,最终 $A = [1, 2, 3, 2]$。这标志着第一阶段结束。
在代码的第二阶段,你的程序接收到列表 1 2 3 2。
它响应 1 3。
由于其中一个猜测是正确的房子索引(1),Anna 和 Bertil 赢得了游戏。