#CCAC000114. 蒂娜的谜箱

蒂娜的谜箱

题目描述

这是一道交互题。

蒂娜准备了 nn 个方块,分别标有整数 1,2,…,n1,2,\ldots,n,以及从左到右编号为 1,2,…,n1,2,\ldots,n 的 nn 个格子。她已经为这些方块确定了一种正确的摆放顺序,并将它藏在了谜箱中。

正确顺序可以表示为一个排列 p1,p2,…,pnp_1,p_2,\ldots,p_n,其中 pip_i 表示第 ii 个格子中应当放置的方块编号。这个排列在交互开始前已经确定,在整个交互过程中不会改变。

你可以反复尝试摆放方块。每次尝试时,每个格子至多放置一个方块,同一个方块至多使用一次,也可以留下一些空格子。蒂娜只会告诉你:有多少个格子中放置了正确的方块。

你需要在不超过 8n8n 次尝试后,确定并提交完整的正确顺序。最终提交不计入尝试次数。

输入格式

交互开始时,你的程序需要从标准输入读取一个整数 nn (2≤n≤1002\le n\le100),表示方块和格子的数量。

单次程序运行只包含一局游戏,没有测试组数 tt。隐藏排列 pp 不会作为输入提供给选手程序。

此后,输入内容为交互器对询问命令的回复,具体格式见交互格式。最终提交后没有回复。

输出格式

你的程序需要按照交互格式向标准输出发送询问,并最终提交排列 pp。

每条命令必须单独占一行,包含一个命令符和恰好 nn 个整数。每次输出命令后,都必须换行并刷新输出缓冲区。

发送询问命令后,应读取交互器的回复;发送最终提交命令后,应立即结束程序,不再读取任何内容。

交互格式

你的程序可以发送以下两种命令。

1. 询问一次摆放方案

输出一行:

? a1 a2 ⋯ an\texttt{?}\ a_1\ a_2\ \cdots\ a_n

对于所有 1≤i≤n1\le i\le n,必须满足 0≤ai≤n0\le a_i\le n。其中,ai=0a_i=0 表示第 ii 个格子留空;ai>0a_i>0 表示在第 ii 个格子中放置编号为 aia_i 的方块。所有非零的 aia_i 必须互不相同,00 可以重复出现。

交互器回复一个整数

$$r=\left|\left\{i\mid 1\le i\le n,\ a_i=p_i\right\}\right|,$$

表示正确放置的方块数量。空格子不计入正确数量。将所有格子留空也是一次合法询问,并计入询问次数。

你最多可以发送 8n8n 次询问。即使某次询问的回复为 nn,你仍然需要通过最终提交命令提交答案。

2. 提交最终答案

输出一行:

! b1 b2 ⋯ bn\texttt{!}\ b_1\ b_2\ \cdots\ b_n

其中 b1,b2,…,bnb_1,b_2,\ldots,b_n 必须是 1,2,…,n1,2,\ldots,n 的一个排列。

如果对于所有 1≤i≤n1\le i\le n 都有 bi=pib_i=p_i,则答案正确;否则,答案错误。

交互器不会对最终提交作出任何回复。输出最终答案、换行并刷新输出缓冲区后,你的程序必须立即结束,不应再尝试读取任何内容。

最终答案只能提交一次,且不计入 8n8n 次询问的限制。

3. 交互注意事项

在询问阶段,如果你的程序发出了非法命令或询问次数超过限制,交互器将回复 −1-1 并结束交互。如果读取到 −1-1 或读取失败,你的程序必须立即结束,不能继续输出。

对于最终提交,交互器将直接判定答案并结束交互,无论答案正确与否,都不会发送回复。

命令符与整数、相邻整数之间应使用空格或制表符分隔。行首、行末的空格或制表符不影响判定。不得输出空行、额外字段,或将一条命令拆成多行。

每次输出命令后必须刷新输出缓冲区。例如,使用 C++ 时可以调用 cout.flush(),或使用会同时换行并刷新的 endl。

4

0

2

4


? 1 2 3 4

? 0 1 0 2

? 3 1 4 2

! 3 1 4 2

样例解释

在样例中,n=4n=4,隐藏排列为 (3,1,4,2)(3,1,4,2)。隐藏排列仅在这里用于解释样例,不会由交互器发送给选手程序。

样例输入依次列出了交互器发送的内容,样例输出依次列出了选手程序发送的内容。它们是双方交互记录的两个方向,不是普通的离线输入输出。实际交互必须按以下顺序进行:

顺序 发送方 发送内容
1 交互器 4
2 选手程序 ? 1 2 3 4
3 交互器 0
4 选手程序 ? 0 1 0 2
5 交互器 2
6 选手程序 ? 3 1 4 2
7 交互器 4
8 选手程序 ! 3 1 4 2

第一次询问没有任何方块放在正确的位置,因此回复为 00。

第二次询问只在第 22 个格子和第 44 个格子中放置了方块,它们都正确,因此回复为 22。

第三次询问的四个位置都正确,因此回复为 44。选手程序随后发送最终提交命令,换行并刷新输出缓冲区后立即结束。交互器判定答案正确,不再发送回复。

样例只展示一种合法的交互过程,不表示能够用相同次数的询问解决所有隐藏排列。