CF1979F Kostyanych's Theorem

题目描述

这是一个交互题。 Kostyanych 选择了一个有 $n$ 个顶点的完全无向图 $^{\dagger}$,然后从中恰好删除了 $(n-2)$ 条边。你可以进行如下类型的查询: - "? $d$" —— Kostyanych 会告诉你一个度数至少为 $d$ 的顶点 $v$ 的编号。在所有满足条件的顶点中,他会选择度数最小的那个,如果有多个,则选择编号最小的那个。他还会告诉你图中另一个与 $v$ 没有边相连的顶点的编号(如果没有这样的顶点,则返回 $0$)。在所有可能的顶点中,他选择编号最小的那个。然后他会移除顶点 $v$ 及其所有相连的边。如果没有找到满足条件的顶点 $v$,则返回 "0 0"。 请在最多 $n$ 次查询内,找出原图中的一条哈密顿路径 $^{\ddagger}$。可以证明,在上述约束下,原图一定存在哈密顿路径。 $^{\dagger}$ 完全无向图是指任意两个不同顶点之间恰好有一条无向边的图。因此,$n$ 个顶点的完全无向图有 $\frac{n(n-1)}{2}$ 条边。 $^{\ddagger}$ 哈密顿路径是指经过图中每个顶点恰好一次的一条路径。

输入格式

每个测试包含多个测试用例。第一行包含一个整数 $t$($1 \le t \le 1000$)——表示测试用例的数量。接下来是每个测试用例的描述。 每个测试用例的唯一一行包含一个整数 $n$($2 \le n \le 10^5$)——表示图中顶点的数量。 保证所有测试用例中 $n$ 的总和不超过 $10^5$。

输出格式

每个测试用例的交互从读取整数 $n$ 开始。 然后你最多可以进行 $n$ 次查询。 每次查询,输出一行,格式为 "? $d$"(不含引号)($0 \le d \le n-1$)。每次查询后,读取两个整数,作为该查询的回答。 当你准备好输出答案时,输出一行,格式为 "! $v_1\ v_2 \ldots v_n$"(不含引号)——表示哈密顿路径上顶点的顺序。输出答案不计入 $n$ 次查询次数。完成一个测试用例后,程序应立即进入下一个测试用例。所有测试用例完成后,程序应立即终止。 如果某个测试用例中查询次数超过 $n$ 次,或查询格式不正确,则该查询的返回值为 $-1$,收到该返回值后,你的程序应立即终止以获得 Wrong answer 判定。否则,可能会收到其他判定。 每次输出查询后,别忘了输出换行并刷新输出缓冲区,否则会收到 Idleness limit exceeded 判定。具体方法如下: - C++:fflush(stdout) 或 cout.flush() - Java:System.out.flush() - Pascal:flush(output) - Python:stdout.flush() - 其它语言请查阅相关文档。 交互器是非自适应的。图在交互过程中不会发生变化。 Hack 格式 Hack 时请使用如下格式: 第一行包含一个整数 $t$($1 \le t \le 1000$)——表示测试用例数量。 每个测试用例的唯一一行包含一个整数 $n$($2 \le n \le 10^5$)——表示图中顶点数量。 接下来的 $(n-2)$ 行,每行包含两个整数 $u$ 和 $v$($1 \le u, v \le n$,$u \ne v$)——表示被删除的边的两个端点。每条边最多只能出现一次。 所有测试用例中 $n$ 的总和不超过 $10^5$。

说明/提示

在第一个测试用例中,原图如下所示: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1979F/42089518245c2488c2bfecf2fe23dadea3c789e8.png) 考虑如下查询: - 图中没有度数至少为 $3$ 的顶点,因此返回 "0 0"。 - 有四个顶点度数至少为 $2$,且它们的度数都恰好为 $2$:$1$、$2$、$3$、$4$。返回顶点 $1$(编号最小),以及与 $1$ 不相连的顶点 $4$(唯一一个)。然后移除顶点 $1$。 - 剩下三个顶点度数至少为 $1$,其中 $2$ 和 $3$ 的度数最小(为 $1$,$4$ 的度数为 $2$)。返回顶点 $2$(编号最小),以及与 $2$ 不相连的顶点 $3$(唯一一个)。然后移除顶点 $2$。 路径 $4-3-1-2$ 是一条哈密顿路径。 在第二个测试用例中,原图如下所示: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1979F/8d69c71de95e98946d0d15367d0511bf08d2ba0a.png) 考虑如下查询: - 顶点 $1$ 的度数至少为 $3$,但它与所有顶点都相连,因此返回 "1 0"。然后移除顶点 $1$。 - 剩下的顶点 $2$、$3$、$4$ 的度数至少为 $0$,其中 $4$ 的度数最小(为 $0$,$2$ 和 $3$ 的度数为 $1$)。$4$ 与 $2$ 和 $3$ 都不相连,因此返回 $2$(编号最小)。然后移除顶点 $4$。 路径 $4-1-2-3$ 是一条哈密顿路径。 在第三个测试用例中,图由 $2$ 个顶点和一条边组成。 由 ChatGPT 4.1 翻译