CF1521C Nastia and a Hidden Permutation

题目描述

这是一个交互题! Nastia 有一个长度为 $n$ 的隐藏排列 $p$,其中包含 $1$ 到 $n$ 的整数。你出于某种原因想要找出这个排列。为此,你可以给她一个整数 $t$($1 \le t \le 2$)、两个不同的下标 $i$ 和 $j$($1 \le i, j \le n$,$i \neq j$),以及一个整数 $x$($1 \le x \le n - 1$)。 根据 $t$ 的不同,她会回答你: - $t = 1$:$\max{(\min{(x, p_i)}, \min{(x + 1, p_j)})}$; - $t = 2$:$\min{(\max{(x, p_i)}, \max{(x + 1, p_j)})}$。 你最多可以询问 Nastia $\lfloor \frac {3 \cdot n} { 2} \rfloor + 30$ 次。保证她不会根据你的询问改变她的排列。你能猜出这个排列吗?

输入格式

输入包含若干组测试数据。首先,你会收到一个整数 $T$($1 \le T \le 10\,000$)——表示测试用例的数量。 每组测试数据开始时,你会收到一个整数 $n$($3 \le n \le 10^4$)——表示排列 $p$ 的长度。 保证排列在你询问前已经确定,并且单次测试中所有 $n$ 的总和不超过 $2 \cdot 10^4$。

输出格式

每次询问时,输出 "? $t$ $i$ $j$ $x$"($t = 1$ 或 $t = 2$,$1 \le i, j \le n$,$i \neq j$,$1 \le x \le n - 1$),然后读取答案。 如果我们返回 $-1$ 而不是有效答案,说明你超出了询问次数限制或询问不合法。收到 $-1$ 后应立即退出,否则你的程序会继续读取已关闭的流,可能导致任意判题结果。 当你猜出排列后,输出 "! $p_1$ $p_2$ $\ldots$ $p_n$"(不带引号)。注意,输出答案不计入 $\lfloor \frac {3 \cdot n} { 2} \rfloor + 30$ 次询问限制。 每次输出询问或答案后,别忘了输出换行并刷新输出缓冲区,否则会因“超出空闲时间限制”被判为超时。具体做法如下: - C++:fflush(stdout) 或 cout.flush() - Java:System.out.flush() - Pascal:flush(output) - Python:stdout.flush() - 其它语言请查阅相关文档。 Hack 数据 要 Hack 其它解法,请使用如下测试格式。 第一行包含一个整数 $T$($1 \le T \le 10\,000$)——表示测试用例数量。 每组测试数据第一行输出一个整数 $n$($3 \le n \le 10^4$)——隐藏排列 $p$ 的长度。 第二行输出 $n$ 个用空格分隔的整数 $p_1, p_2, \ldots, p_n$($1 \le p_i \le n$),表示排列 $p$。 注意,所有测试用例中 $n$ 的总和不超过 $2 \cdot 10^4$。

说明/提示

考虑第一个测试用例。 隐藏排列为 $[3, 1, 4, 2]$。 我们输出:"? 2 4 1 3",得到 $\min{(\max{(3, p_4)}, \max{(4, p_1)})} = 3$。 我们输出:"? 1 2 4 2",得到 $\max{(\min{(2, p_2)}, \min{(3, p_4)})} = 2$。 再看第二个测试用例。 隐藏排列为 $[2, 5, 3, 4, 1]$。 我们输出:"? 2 3 4 2",得到 $\min{(\max{(2, p_3)}, \max{(3, p_4)})} = 3$。 由 ChatGPT 4.1 翻译