#HK5049. 「JOISC 2025 Day2」宇宙怪盗

「JOISC 2025 Day2」宇宙怪盗

题目描述

题目译自 JOISC 2025 Day2 T3 「宇宙怪盗 / Space Thief

在 JOI 银河中,你是一位声名赫赫的怪盗。JOI 银河拥有 NN 个星球,编号从 00N1N-1,还有 MM 个传送装置,编号从 00M1M-1。每个传送装置 ii (0iM1)(0 \leq i \leq M-1) 双向连接星球 UiU_iViV_i,且任意两颗星球间都能通过若干传送装置到达。

某颗星球藏着一把钥匙,另一颗藏着宝箱。你的任务是找出钥匙所在的星球编号 AA 和宝箱所在的星球编号 BB。为此,你最多可以进行 300300 次提问:

  • 对每个传送装置 ii (0iM1)(0 \leq i \leq M-1),选择将其改为单向连接:从 UiU_iViV_i,或从 ViV_iUiU_i
  • 然后询问在此设定下,是否能从钥匙星球 AA 通过若干传送装置到达宝箱星球 BB

你希望通过提问锁定 AABB,并为了赢得高评价,尽量减少提问次数。给定银河的信息,编写一个程序实现你的策略,找出钥匙和宝箱的位置。

实现细节

你需提交一个名为 thief.cpp 的文件。该文件需通过 #include 引入 thief.h,并实现以下函数:

  • void solve(int N, int M, std::vector<int> U, std::vector<int> V)
    • 每个测试点调用一次。
    • 参数 N 是星球数量 NN
    • 参数 M 是传送装置数量 MM
    • 参数 U,V 是长度为 MM 的数组,U[i]V[i] 表示传送装置 ii 双向连接的星球编号 UiU_iViV_i

thief.cpp 中可调用以下函数:

  • int query(std::vector<int> x)
    • 用于提问。
    • 参数 x 是长度为 MM 的数组,对于 0iM10\leq i\leq M-1x[i]00 表示装置 iiUiU_iViV_i 单向连接,x[i]11 表示从 ViV_iUiU_i 单向连接。
    • 返回值为 00 表示无法从 AABB11 表示可行。
    • 约束:
      • x 长度必须为 MM,否则判为 Wrong Answer [1]
      • x 各元素须为 0011,否则判为 Wrong Answer [2]
      • 调用次数不得超 300300,否则判为 Wrong Answer [3]
  • void answer(int A, int B)
    • 提交答案。
    • 参数 A 是钥匙星球编号,需满足 0AN10 \leq A \leq N-1,否则判为 Wrong Answer [4]
    • 参数 B 是宝箱星球编号,需满足 0BN10 \leq B \leq N-1,否则判为 Wrong Answer [5]
    • AB 错误,判为 Wrong Answer [6]
    • 必须调用恰好一次,多于一次判为 Wrong Answer [7],未调用判为 Wrong Answer [8]

注意事项

  • 可自由定义其他函数或全局变量。
  • 程序不得与标准输入输出或其他文件交互,但可输出调试信息到标准错误流。

部分测试点为自适应评测,即答案非固定,随 query 调用动态调整,但保证存在至少一种一致解。

编译与运行

「文件」界面提供示例评测程序的压缩包,包含 grader.cpp 和样例文件。测试时,将 grader.cppthief.cppthief.h 置于同一目录,运行:

g++ -std=gnu++20 -O2 -o grader grader.cpp thief.cpp

或使用 compile.sh

./compile.sh

成功后生成 grader 可执行文件。注意:实际评测程序与示例不同,示例为单进程,从标准输入读取,输出到标准输出。

输入格式

第一行包含四个整数 N,M,A,BN,M,A,B

接下来 MM 行,每行包含两个整数 Ui,ViU_i,V_i

输出格式

输出到标准输出:

  • 正确:输出 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)

11query 函数调用的选择如下:

  • 传送装置 00:从星球 00 到星球 11 单向连接。
  • 传送装置 11:从星球 33 到星球 00 单向连接。
  • 传送装置 22:从星球 11 到星球 22 单向连接。
  • 传送装置 33:从星球 11 到星球 44 单向连接。 在此设置下,可以通过传送装置 0,30, 3 依次从星球 00 移动到星球 44,因此返回值为 11

22query 函数调用的选择如下:

  • 传送装置 00:从星球 11 到星球 00 单向连接。
  • 传送装置 11:从星球 33 到星球 00 单向连接。
  • 传送装置 22:从星球 22 到星球 11 单向连接。
  • 传送装置 33:从星球 11 到星球 44 单向连接。 在此设置下,无法通过传送装置从星球 00 移动到星球 44,因此返回值为 00

33query 函数调用的选择如下:

  • 传送装置 00:从星球 00 到星球 11 单向连接。
  • 传送装置 11:从星球 00 到星球 33 单向连接。
  • 传送装置 22:从星球 22 到星球 11 单向连接。
  • 传送装置 33:从星球 11 到星球 44 单向连接。 在此设置下,可以通过传送装置从星球 00 移动到星球 44,因此返回值为 11

44query 函数调用的选择下,无法通过传送装置从星球 00 移动到星球 44,因此返回值为 00

answer 函数调用表示回答藏有钥匙的星球为 00,藏有宝箱的星球为 44

此样例满足子任务 3,4,5,6,7,83,4,5,6,7,8 的限制,对应 sample-01-in.txt

数据范围与提示

对于所有输入数据,满足:

  • 2N100002 \leq N \leq 10000
  • 1M150001 \leq M \leq 15000
  • 0AN10 \leq A \leq N-1
  • 0BN10 \leq B \leq N-1
  • ABA \neq B
  • 0Ui<ViN10 \leq U_i < V_i \leq N-1 (0iM1)(0 \leq i \leq M-1)
  • (Ui,Vi)(Uj,Vj)(U_i, V_i) \neq (U_j, V_j) (0i<jM1)(0 \leq i < j \leq M-1)
  • 任意两星球间可通过若干传送装置连通

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 77 M=N1,Ui=i,Vi=i+1(0iM1)M = N-1, U_i = i, V_i = i+1 \, (0 \leq i \leq M-1)
22 1313 M=N1,Ui=0,Vi=i+1(0iM1)M = N-1, U_i = 0, V_i = i+1 \, (0 \leq i \leq M-1)
33 22 M=N1,N8M = N-1, N \leq 8
44 88 M=N1,N50M = N-1, N \leq 50
55 55 M=N1,N150M = N-1, N \leq 150
66 55 M=N1,N250M = N-1, N \leq 250
77 4040 M=N1M = N-1,得分根据 TTquery 最大调用次数):T>120T > 1202020 分,70<T12070 < T \leq 1203030 分,T70T \leq 704040 分,任一测试点错误得 00
88 2020 无附加限制,得分根据 TTT>120T > 1201010 分,70<T12070 < T \leq 1201515 分,T70T \leq 702020 分,任一测试点错误得 00

子任务 1166 得分不根据 query 次数(300\leq 300 即可),但超 7070 次可能显示 Partially Correct