#HK5049. 「JOISC 2025 Day2」宇宙怪盗
「JOISC 2025 Day2」宇宙怪盗
题目描述
题目译自 JOISC 2025 Day2 T3 「宇宙怪盗 / Space Thief」
在 JOI 银河中,你是一位声名赫赫的怪盗。JOI 银河拥有 个星球,编号从 到 ,还有 个传送装置,编号从 到 。每个传送装置 双向连接星球 和 ,且任意两颗星球间都能通过若干传送装置到达。
某颗星球藏着一把钥匙,另一颗藏着宝箱。你的任务是找出钥匙所在的星球编号 和宝箱所在的星球编号 。为此,你最多可以进行 次提问:
- 对每个传送装置 ,选择将其改为单向连接:从 到 ,或从 到 。
- 然后询问在此设定下,是否能从钥匙星球 通过若干传送装置到达宝箱星球 。
你希望通过提问锁定 和 ,并为了赢得高评价,尽量减少提问次数。给定银河的信息,编写一个程序实现你的策略,找出钥匙和宝箱的位置。
实现细节
你需提交一个名为 thief.cpp 的文件。该文件需通过 #include 引入 thief.h,并实现以下函数:
void solve(int N, int M, std::vector<int> U, std::vector<int> V)- 每个测试点调用一次。
- 参数
N是星球数量 。 - 参数
M是传送装置数量 。 - 参数
U,V是长度为 的数组,U[i]和V[i]表示传送装置 双向连接的星球编号 和 。
在 thief.cpp 中可调用以下函数:
int query(std::vector<int> x)- 用于提问。
- 参数
x是长度为 的数组,对于 ,x[i]为 表示装置 从 到 单向连接,x[i]为 表示从 到 单向连接。 - 返回值为 表示无法从 到 , 表示可行。
- 约束:
x长度必须为 ,否则判为Wrong Answer [1]。x各元素须为 或 ,否则判为Wrong Answer [2]。- 调用次数不得超 ,否则判为
Wrong Answer [3]。
void answer(int A, int B)- 提交答案。
- 参数
A是钥匙星球编号,需满足 ,否则判为Wrong Answer [4]。 - 参数
B是宝箱星球编号,需满足 ,否则判为Wrong Answer [5]。 - 若
A或B错误,判为Wrong Answer [6]。 - 必须调用恰好一次,多于一次判为
Wrong Answer [7],未调用判为Wrong Answer [8]。
注意事项
- 可自由定义其他函数或全局变量。
- 程序不得与标准输入输出或其他文件交互,但可输出调试信息到标准错误流。
部分测试点为自适应评测,即答案非固定,随 query 调用动态调整,但保证存在至少一种一致解。
编译与运行
「文件」界面提供示例评测程序的压缩包,包含 grader.cpp 和样例文件。测试时,将 grader.cpp、thief.cpp、thief.h 置于同一目录,运行:
g++ -std=gnu++20 -O2 -o grader grader.cpp thief.cpp
或使用 compile.sh:
./compile.sh
成功后生成 grader 可执行文件。注意:实际评测程序与示例不同,示例为单进程,从标准输入读取,输出到标准输出。
输入格式
第一行包含四个整数 。
接下来 行,每行包含两个整数 。
输出格式
输出到标准输出:
- 正确:输出
query调用次数,如Accepted: 25。 - 错误:输出类型,如
Wrong Answer [4]。若有多重错误,仅显示一种,可能提前终止。
5 4 0 4
0 1
0 3
1 2
1 4
| 函数调用 | 返回值 | |
|---|---|---|
solve(5, 4, [0, 0, 1, 1], [1, 3, 2, 4]) |
||
query([0, 1, 0, 0]) |
1 |
|
query([1, 1, 1, 0]) |
0 |
|
query([0, 0, 1, 0]) |
1 |
|
query([0, 0, 1, 1]) |
0 |
|
answer(0, 4) |
||
第 次 query 函数调用的选择如下:
- 传送装置 :从星球 到星球 单向连接。
- 传送装置 :从星球 到星球 单向连接。
- 传送装置 :从星球 到星球 单向连接。
- 传送装置 :从星球 到星球 单向连接。 在此设置下,可以通过传送装置 依次从星球 移动到星球 ,因此返回值为 。
第 次 query 函数调用的选择如下:
- 传送装置 :从星球 到星球 单向连接。
- 传送装置 :从星球 到星球 单向连接。
- 传送装置 :从星球 到星球 单向连接。
- 传送装置 :从星球 到星球 单向连接。 在此设置下,无法通过传送装置从星球 移动到星球 ,因此返回值为 。
第 次 query 函数调用的选择如下:
- 传送装置 :从星球 到星球 单向连接。
- 传送装置 :从星球 到星球 单向连接。
- 传送装置 :从星球 到星球 单向连接。
- 传送装置 :从星球 到星球 单向连接。 在此设置下,可以通过传送装置从星球 移动到星球 ,因此返回值为 。
第 次 query 函数调用的选择下,无法通过传送装置从星球 移动到星球 ,因此返回值为 。
answer 函数调用表示回答藏有钥匙的星球为 ,藏有宝箱的星球为 。
此样例满足子任务 的限制,对应 sample-01-in.txt。
数据范围与提示
对于所有输入数据,满足:
- 任意两星球间可通过若干传送装置连通
详细子任务附加限制及分值如下表所示。
| 子任务 | 分值 | 附加限制 |
|---|---|---|
,得分根据 (query 最大调用次数): 得 分, 得 分, 得 分,任一测试点错误得 分 |
||
| 无附加限制,得分根据 : 得 分, 得 分, 得 分,任一测试点错误得 分 |
子任务 至 得分不根据 query 次数( 即可),但超 次可能显示 Partially Correct。