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 翻译