CF1621C Hidden Permutations

题目描述

这是一个交互题。 评测器有一个长度为 $n$ 的排列 $p$,你需要猜出它。为此,评测器还创建了另一个长度为 $n$ 的排列 $q$。初始时,$q$ 是一个恒等排列(即 $q_i = i$ 对所有 $i$ 成立)。 你可以进行若干次询问,询问任意 $i$ 的 $q_i$ 值。每次询问后,评测器会按如下方式修改 $q$: - 首先,评测器会创建一个新的排列 $q'$,其中 $q'_i = q_{p_i}$ 对所有 $i$ 成立。 - 然后,评测器用 $q'$ 替换 $q$。 你最多可以进行 $2n$ 次询问来猜出 $p$。

输入格式

输入的第一行包含一个整数 $t$($1 \leq t \leq 1000$),表示测试用例的数量。

输出格式

每个测试用例的交互从读取一个整数 $n$($1 \leq n \leq 10^4$)开始,表示排列 $p$ 和 $q$ 的长度。 为了获得 $q_i$ 的值,你需要输出形如 $?$ $i$($1 \leq i \leq n$)的询问。之后你会收到 $q_i$ 的值。 你最多可以进行 $2n$ 次询问。如果你进行了非法的询问,你会收到 $0$ 作为回复,此时应立即退出,否则会被判为 Wrong answer。 当你准备好输出 $p$ 时,输出 $!$ $p_1$ $p_2$ $\ldots$ $p_n$。输出排列不计入 $2n$ 次询问次数。 每次输出后不要忘记换行并刷新输出缓冲区,否则会被判为 Idleness limit exceeded。具体做法如下: - C++:fflush(stdout) 或 cout.flush() - Java:System.out.flush() - Pascal:flush(output) - Python:stdout.flush() - 其它语言请查阅相关文档。 保证所有测试用例中 $n$ 的总和不超过 $10^4$。交互器在本题中是非自适应的。 Hack 格式: 第一行包含一个整数 $t$,表示测试用例数量。 每个测试用例的第一行包含一个整数 $n$,表示排列 $p$ 和 $q$ 的长度。第二行包含 $n$ 个整数 $p_1, p_2, \ldots, p_n$,表示本测试用例的隐藏排列。

说明/提示

在第一个测试用例中,隐藏排列 $p = [4, 2, 1, 3]$。 第一次询问前,$q = [1, 2, 3, 4]$,所以对 $q_3$ 的询问结果是 $3$。 第二次询问前,$q = [4, 2, 1, 3]$,所以对 $q_2$ 的询问结果是 $2$。 第三次询问前,$q = [3, 2, 4, 1]$,所以对 $q_4$ 的询问结果是 $1$。 在第二个测试用例中,隐藏排列 $p = [1, 3, 4, 2]$。 空行仅用于更好的可读性,评测系统中不会有空行。 由 ChatGPT 4.1 翻译