QOJ.ac

QOJ

実行時間制限: 10.0 s メモリ制限: 512 MB 満点: 100 インタラクティブ

#17630. 哈密顿

統計

考虑一个包含 $n$ 个节点(编号为 $1, 2, \dots, n$)的有向图。如果图中任意一对节点之间都恰好有一条有向边,则称该图为竞赛图(tournament)。也就是说,对于任意两个不同的节点 $u$ 和 $v$,要么存在从 $u$ 到 $v$ 的边,要么存在从 $v$ 到 $u$ 的边。

哈密顿回路是一个访问所有节点并回到起点的序列 $c_1, c_2, \dots, c_n$,且该序列沿图中的边行进。对于所有 $1 \le i \le n - 1$,必须存在从 $c_i$ 到 $c_{i+1}$ 的边。此外,还必须存在从 $c_n$ 到 $c_1$ 的边。

你可以自由构造一个包含 $n$ 个节点的竞赛图。随后,节点的编号会被打乱。通过对打乱后的图进行关于边方向的询问,你能否找到一条哈密顿回路?

交互

这是一个交互式问题。首先读取两个整数 $n$ 和 $t$:节点数量和测试用例数量。

接下来,输出 $n$ 行来描述你构造的竞赛图。在第 $u$ 行中,输出 $n$ 个字符 "0" 或 "1"。位置 $v$ 处的字符 "1" 表示存在一条从 $u$ 到 $v$ 的边。不应存在从 $u$ 到 $u$ 的边。

随后进行 $t$ 个测试用例。每个测试用例使用你提供的同一个图,但节点编号已被打乱,且对你保密。你可以进行若干次询问,之后你需要报告一条哈密顿回路。

进行询问时,输出 ? u v,其中 $1 \le u, v \le n$ 是打乱后图中的不同节点。评测机将返回 ">"(表示存在从 $u$ 到 $v$ 的边)或 "<"(表示存在从 $v$ 到 $u$ 的边)。

当你找到一条哈密顿回路后,输出 "!",后跟 $n$ 个整数 $c_1, c_2, \dots, c_n$。注意,数字 $c_i$ 应遵循打乱后的编号。在你输出答案后,下一个测试用例立即开始。

你可以从这里下载测试脚本。脚本开头包含使用说明。

数据范围

  • $4 \le n \le 500$
  • $1 \le t \le 200$

样例

输入格式 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

输出格式 1

(交互过程见输入格式)

说明

在第一个测试用例中,节点恰好被打乱为原始顺序,因此 $1, 2, 3, 4, 5$ 是一条哈密顿回路。

在第二个测试用例中,节点编号被打乱为 $2, 4, 1, 5, 3$。序列 $1, 5, 4, 3, 2$ 确实是一条哈密顿回路,因为 $3, 4, 2, 5, 1$ 在原始图中是一条边序列。

下图左侧展示了原始图,右侧展示了第二个测试用例中打乱后的图。两条哈密顿回路均以红色高亮显示。

原始图(左)与打乱后的图(右)

评分

每个子任务包含一个测试输入,其中 $t = 200$。在每个测试用例中,图的编号是均匀随机打乱的。在单个测试用例中进行超过 $10^4$ 次询问会导致判决为 WRONG ANSWER。

设 $Q$ 为你的程序在子任务所属的所有测试用例中进行的平均询问次数。如果 $Q$ 不超过指定的限制,你将获得该子任务的分数。

子任务 数据范围 分数
1 $n = 4, Q \le 12$ 5
2 $n = 50, Q \le 1225$ 7
3 $n = 50, Q \le 300$ 12
4 $n = 500, Q \le 1500$ 1–76

在子任务 4 中,你根据以下公式获得分数:

$$\left\lfloor \frac{25\,000}{\max(750, Q) - 500} - 24 \right\rfloor$$

例如,如果你的程序进行的平均询问次数为 $Q = 1500$,你将获得 1 分;如果 $Q = 1000$,你将获得 26 分;如果 $Q = 750$,你将获得 76 分。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.