#loj5716. 「BalticOI 2026」哈密顿
「BalticOI 2026」哈密顿
#5716. 「BalticOI 2026」哈密顿
标签: 交互 | 时间限制: 10000 ms | 内存限制: 512 MiB |
题目描述
题目译自 BalticOI 2026 Day2「Hamilton」
考虑一个有 个结点的有向图,结点编号为 。若任意两点之间恰好存在一条有向边,则称该图为竞赛图。也就是说,对于任意两个不同的结点 和 ,要么存在从 到 的边,要么存在从 到 的边。
哈密顿回路是一个序列 ,它访问图中所有结点并最终回到起点,且路径必须沿着图中的边进行。对于所有 ,必须存在从 到 的边。此外,必须存在从 到 的边。
你可以自由构建一个 个结点的竞赛图。随后,结点的编号会被打乱。通过对打乱后的图中边的方向进行询问,你能找到一条哈密顿回路吗?
交互方式
这是一个交互题。首先读取两个整数 和 :结点数量和测试用例数量。
接着,输出 行来描述竞赛图。在这些行中的第 行,输出 个字符 0 或 1。位置 处的字符 1 表示存在一条从 到 的边。注意 到自身不应有边。
之后是 个测试用例。每个测试用例使用你提供的同一个图,但结点的编号已被打乱并由交互器保密。你可以进行若干次询问,之后你需要报告一条哈密顿回路。
进行询问时,输出 ? ,其中 是打乱后图中不同的结点。交互器会回复 > 表示边是从 指向 ,或者 < 表示边是从 指向 。
当你找到哈密顿回路后,输出 !,随后输出 个整数 。注意,整数 应遵循打乱后的编号。在你输出答案后,下一个测试用例立即开始。
可在此处下载测试脚本。脚本开头包含使用说明。
样例
5 2
01110
00101
00010
01001
10100
? 1 2
>
? 2 3
>
? 3 4
>
? 4 5
>
? 5 1
>
! 1 2 3 4 5
? 1 2
<
? 1 5
>
? 4 3
>
? 4 5
<
? 3 2
>
! 1 5 4 3 2
在第一个测试用例中,结点恰好被打乱为原始顺序,因此 是一条哈密顿回路。
在第二个测试用例中,结点编号 被打乱为 。序列 确实是一条哈密顿回路,因为 在原图中是一条哈密顿回路。
下图中,左侧显示了原图,右侧显示了第二个测试用例中被打乱后的图。两条哈密顿回路均以红色高亮显示。

数据范围与提示
对于所有输入数据,满足:
每个子任务中仅有一个测试输入,包含 个测试用例。在每个测试用例中,图的结点编号是随机均匀打乱的。在单个测试用例中询问次数超过 次将导致结果为 WRONG ANSWER。
设 为你的程序在子任务所属的所有测试用例中的平均询问次数。若 不超过指定限制,你将获得该子任务的分数。
详细子任务附加限制及分值如下表所示。
| 子任务 | 附加限制 | 分值 |
|---|---|---|
在子任务 中,你获得的分数根据以下公式计算:
$$\left\lfloor\frac{25000}{\max (750, Q)-500}-24\right\rfloor$$若你的程序平均询问次数 ,则该子任务得 分。若 ,则得 分;若 ,则得 分。