CF1779E Anya's Simultaneous Exhibition

题目描述

这是一个交互题。 Anya 聚集了 $n$ 位国际象棋高手,编号从 $1$ 到 $n$,并且满足以下性质: - 对于任意一对选手,总有一方能在每场比赛中战胜对方(且不会出现平局); - 但不一定满足传递性——可能存在 $A$ 总是战胜 $B$,$B$ 总是战胜 $C$,而 $C$ 总是战胜 $A$。 Anya 并不知道每一对选手中谁能战胜谁。为了组织一场锦标赛,Anya 会举办 $n-1$ 场比赛。每场比赛,她选择两名选手,其中一人获胜并留下,另一人被淘汰。所有比赛结束后,只剩下一名选手。若某位选手有可能赢得锦标赛(注意,最终的获胜者可能取决于 Anya 在 $n-1$ 场比赛中选择的选手),则称该选手为候选大师。 由于 Anya 很好奇,她想找出所有的候选大师。但她时间有限。为了加快进度,她最多会组织 $2n$ 场“simul”(即“同时对弈”,一名选手同时与多名选手对弈)。 在一场 simul 中,Anya 选择一名选手,让其与其他一些(至少一名)选手对弈。被选中的选手会赢下所有他在常规比赛中能赢的对局,输掉所有他在常规比赛中会输的对局。simul 结束后,Anya 只会被告知该选手赢了多少场(但不会告知具体赢了哪些对手)。simul 期间没有人会被淘汰。 你能帮助 Anya 通过组织 simul 找出所有候选大师吗? 每一对选手的胜负关系在不同的 simul 之间可以改变,但必须保证所有已知 simul 的结果不变。这些改变可以依赖于你的查询。

输入格式

首先,评测器会发送一个整数 $n$($3 \leq n \leq 250$),表示选手数量。之后,你的程序可以发起查询或报告答案。 若要发起查询,输出一行 `? i s_1 s_2 \ldots s_n`(不含引号),其中 $i$ 表示被选中的选手编号,$s$ 是一个二进制字符串,表示他要与哪些选手对弈。对于每个 $j$,若 $s_j=1$,则 $i$ 要与选手 $j$ 对弈(且至少有一个 $1 \leq j \leq n$ 满足 $s_j=1$)。注意 $s_i=0$,因为选手不能与自己对弈,否则该查询无效。 之后,你需要读取一个整数,表示选手 $i$ 赢了多少场。 当你确定答案后,输出一行 `! c_1 c_2 \ldots c_n`(不含引号),$c$ 是一个二进制字符串,表示候选大师。若选手 $i$ 是候选大师,则 $c_i=1$,否则 $c_i=0$。 如果你发起了超过 $2n$ 次查询,或某次查询格式错误,交互会立即终止,你的程序会收到 Wrong Answer 判定。 每次输出查询后不要忘记换行并刷新输出缓冲区,否则会收到 Idleness limit exceeded 判定。具体做法如下: - C++:fflush(stdout) 或 cout.flush() - Java:System.out.flush() - Pascal:flush(output) - Python:stdout.flush() - 其它语言请查阅相关文档。 本题不支持 Hack。

输出格式

见输入格式说明。

说明/提示

在第一个样例中,第一次查询描述的是选手 $1$ 与选手 $2$ 的 simul。查询结果为 $1$,说明 $1$ 战胜了 $2$。同理,第二次查询说明 $2$ 战胜了 $3$,第三次查询说明 $3$ 战胜了 $1$。因此所有选手都是候选大师,因为: - 若 $2$ 和 $3$ 先比赛,$3$ 输掉并被淘汰,$2$ 留下。然后 $1$ 与 $2$ 比赛并获胜; - 其它选手也可以用类似方式获胜。 在第二个样例中,第三次查询描述的是选手 $1$ 与所有其他选手的 simul。查询结果为 $4$,说明他战胜了所有对手。可以推断 $1$ 能战胜所有其他选手,因此他总能获胜,是唯一的候选大师。 由 ChatGPT 4.1 翻译