CF1466I The Riddle of the Sphinx
题目描述
什么生物早晨用四只脚走路,中午用两只脚走路,晚上用三只脚走路?
本题为交互题。不支持 Hack。
斯芬克斯的职责是守卫底比斯城,确保没有不配的人穿越城门。只有那些及时且正确回答她谜语(或简称 acc)的人才能通过。至于失败者,没有人再听说过他们的消息……
所以你别无选择,只能解答这个谜题。斯芬克斯有一个数组 $a_1, a_2, \ldots, a_n$,其中每个元素都是严格小于 $2^b$ 的非负整数。她要求你找出数组中的最大值。当然,她不会直接展示数组,但会告诉你 $n$ 和 $b$。由于盲目作答是不可能的,你可以向她提问。对于给定的 $i, y$,她会回答你 $a_i$ 是否大于 $y$。由于斯芬克斯没有太多耐心,你最多只能提 $3 \cdot (n + b)$ 个这样的问题。
虽然狡猾,斯芬克斯却很诚实。即使数组在你的查询之间可能发生变化,之前提问得到的答案依然有效。
输入格式
第一行包含两个整数 $n$ 和 $b$($1 \leq n, b \leq 200$)。剩余部分将在交互过程中给出。
输出格式
在每一轮,你的程序必须输出一行,包含一个整数 $i$($0 \leq i \leq n$)和一个长度恰好为 $b$ 的二进制字符串,表示 $y$ 的二进制表示(高位在前)。
如果 $i > 0$,这行表示一个查询:$a_i$ 是否大于 $y$?这样的行最多只能有 $3 \cdot (n+b)$ 行;每次提问后,交互器会在一行中输出 yes 或 no。
如果 $i = 0$,这表示交互的最后一轮,此后你的程序应终止,此时 $y$ 应为斯芬克斯数组中的最大值。注意,这一轮不计入查询次数限制。
请注意,交互器是自适应的。
每次输出查询后,别忘了输出换行并刷新输出缓冲区,否则会收到 Idleness limit exceeded 的判罚。具体操作如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其它语言请查阅相关文档。
如果你的解答没有正确遵循上述交互规范,可能会收到任意判罚。否则,如果你报告的最大值错误,你的程序将收到 Wrong Answer 判罚。
说明/提示
在所有示例中,序列在交互前已固定。
第一个示例中,序列为 $2, 1, 4, 0, 6$。
第二个示例中,序列为 $0, 0, 0, 0$。
第三个示例中,序列为 $0$。
注意,如果交互器是自适应的,那么第一个和第三个示例中的交互过程不足以返回正确的最大值。
由 ChatGPT 4.1 翻译