这是一道通信题
P 国的国土可被视为一张 N 个点 N−1 条边的无向连通图,其中第 i (0≤i≤N−2) 条边连接了顶点 Ai 与 Bi。顶点的编号均为 1∼N 中的正整数。
Pre-SDOI Training Camp(也被称作 Public Easy Round #2
) 即将在 P 国举办,作为一名外国考生,你想要提前得知考试的地点,并希望在考试情报公布前潜入考试地点。为了提前得知考试情报,你已经联系了来自 P 国的一名内鬼,他通过情报网络得知了考试的举办地点已被安排在了顶点 T。由于 P 国的道路信息与考试地点属于机密信息,他无法将这些情报发送给你,于是他决定在每个顶点 i (1≤i≤N) 上放置一个告示牌,并在上面标记一个非负整数 Xi。
随后,你可以通过搭乘 P 国的交通工具到达 P 国的一个顶点 S,但是由于你与内鬼事先都不了解 P 国的交通信息,因此在你真正到达前,内鬼无法得知 S 的值。当你位于一个点时,你可以得到以下信息:
- 你当前所在的顶点的编号 S
- 你当前所在的顶点上所标记的数字 F
- 与你当前所在的顶点相邻的顶点数量 L
- 与你当前所在的顶点相邻的顶点的编号 P0,P1,⋯,PL−1
- 与你当前所在的顶点相邻的顶点上所标记的数字 Q0,Q1,⋯,QL−1
你想要通过这些信息,得知你是否已经到达顶点 T。如果没有,那么你下一步应该前往哪一个顶点,使得该顶点恰好在 S 与 T 所构成的唯一简单路径上。
为了避免内鬼被发现,你们双方想要制定一个策略,使得内鬼所标记的数字尽可能小。
实现细节
这是一道通信题,本题仅支持 C++ 语言。
你需要提交两个程序,分别为 Spy
与 Participant
,来实现你们双方的策略。
Spy
你需要提交的程序名为 Spy.cpp
,描述内鬼传递信息的过程。
你需要包含头文件 Spy.h
,并实现以下函数:
std::vector <int> Init(int N, int T, std::vector <int> A, std::vector <int> B)
- 在每个测试点中,该函数会被调用恰好一次。
- N 表示 P 国的顶点数量 N。
- T 表示比赛举办地点的顶点编号 T。
- A 是一个长度为 N−1 的数组 A0,A1,⋯,AN−2。
- B 是一个长度为 N−1 的数组 B0,B1,⋯,BN−2。
- 该函数需要返回一个长度恰好为 N 的数组 X0,X1,⋯,XN−1,其中 Xi 描述内鬼给点 i+1 赋予的数字。
- 你需要保证 Xi≥0。
Participant
你需要提交的程序名为 Participant.cpp
,描述你的策略。
你需要包含头文件 Participant.h
,并实现以下函数:
int Query(int S, int F, int L, std::vector <int> P, std::vector <int> Q)
- 在每个测试点中,该函数会被调用恰好一次。
- S 表示你此时所在的顶点编号 S。
- F 表示顶点 S 上的数字 F。
- L 表示顶点 S 的度数 L。
- P 是一个长度为 N−1 的数组 P0,P1,⋯,PL−1,表示 S 的所有邻居。
- Q 是一个长度为 N−1 的数组 Q0,Q1,⋯,QL−1,其中第 i (0≤i≤L−1) 个数表示顶点 Pi 上的数字。
该函数需要返回答案,具体地:
- 如果顶点 S 即为比赛举办地点(即 S=T),则需要返回 S。
- 否则,返回一个顶点编号 x∈{P0,P1,⋯,PL−1},表示应从当前顶点前往顶点 x。
- 容易发现,这样的顶点 x 是唯一的。
样例交互库
下发文件中包含了样例交互库 grader.cpp
,该交互库可以帮助你理解这道题目的题意并测试你的程序。在最终评测时,所使用的交互库与该样例交互库有所不同,你的程序不应依赖该样例交互库的实现。
你可以使用以下命令编译出可执行文件 answer
g++ grader.cpp Spy.cpp Participant.cpp -o answer -O2
可执行文件 answer
将从标准输入中读入以下格式的输入数据:
- 输入的第一行包含三个整数 N,S,T。
- 接下来 N−1 行,每行两个整数 Ai,Bi。
可执行文件将向标准输出中输出以下信息:
- 输出的第一行包含一个整数 Y,表示函数
Participant
的返回值。 - 输出的第二行包含一个整数 m,表示函数
Spy
所返回的数组中所有元素的最大值。
请注意,样例交互库不会对你的程序的正确性做任何检查,即样例交互库不会检查你是否共用了全局变量,也不会检查你的程序所返回的值是否正确。
样例 1
考虑以下对样例交互库的输入数据:
5 3 2
1 3
3 2
3 4
4 5
以下是一种可能的通信过程:
# | Spy | Participant | Grader |
---|---|---|---|
1 | Call Spy(...) |
||
2 | Returned {0,1,1,3,1} | ||
3 | Call Participant(...) |
||
4 | Returned 2 |
可执行文件向标准输出中输出
2
3
子任务
对于所有数据,2≤N≤105,1≤S,T≤N,1≤Ai,Bi≤N,保证给定的图联通。
在每个测试点中,如果你的程序超出了时间限制、超出了空间限制、发生了运行时错误,或最终输出的 Y 的值不正确,则你获得 0 分。
否则,设该测试点的满分为 W,你的得分与 m 的值有关:
- 若 0≤m≤1,则你的得分为 W。
- 若 2≤m≤4,则你的得分为 Wαm。
- 若 5≤m≤10,则你的得分为 Wβm。
- 若 10<m≤105,则你的得分为 Wβ25。
- 否则,你的得分为 0。
- 其中 α=32,β=74
本题中 W=100,你可以通过该得点分布表来参考不同的 m 所对应的得点。
m | 得点 |
---|---|
1 | 100.000000 |
2 | 44.444444 |
3 | 29.629630 |
4 | 19.753086 |
5 | 6.092699 |
6 | 3.481543 |
7 | 1.989453 |
8 | 1.136830 |
9 | 0.649617 |
10 | 0.371210 |
11∼105 | 0.000084 |