#P12561. [集训队互测 2024day9]通道建设 Passage Construction
[集训队互测 2024day9]通道建设 Passage Construction
这是一道交互题。
一场叛乱后,上层政府任命你担任这座城市的市长,负责重建。你需要在城市里修建 条通道。
这是一座有着 个依次编号为 街区的大城市,它们由 条双向道路连通。换言之,城市的街区和道路构成一棵树。
所有通道都是单向的,你需要选定恰好 个街区作为入口,其余 个街区作为出口。 条通道需要不重不漏地覆盖所有入口和出口。同时为了避免上层政府质疑通道的修建方案,不能存在两条通道 ,其中 为入口, 为出口,满足 $\operatorname{dis}(a,b)<\operatorname{dis}(a,d)<\operatorname{dis}(c,d)$。此处 定义为街区 到街区 的距离,即最少经过的道路数。
然而叛军烧毁了很多资料,导致你只拥有一份年代久远的城市地图。现在的城市相较于你手上的地图描绘的城市早已经过了许多次扩建。你的地图只有现在的城市的街区 和当时连通它们的 条道路。但扩建不会破坏城市的布局:对扩建前的两条恰有一个公共街区的道路 ,扩建后 到 的最短路径和 到 的最短路径依旧只有一个公共街区 。
由于你暂时人手不足,你只有以下两种渠道收集信息:
- 给定一系列街区 和一系列街区 (需要满足 ),对 中每个街区 ,你可以知道离 最远的在所有路径 上的街区(即以 为根时 中街区的 )是否为一个给定点 。
- 给出两个街区 ,你可以知道 。
请完成修建通道的任务。
实现细节
你不需要,也不应当实现主函数。
你应当引入头文件 passageconstruction.h
。
你应当实现如下函数:
std<span class="sh_symbol">::</span><span class="sh_usertype">vector<std::pair<int,int>> ConstructPassages(int N, const std::vector<std::pair<int,int>></span><span class="sh_normal">¨NBSP;</span><span class="sh_symbol">&</span>E<span class="sh_symbol">);</span>
的含义如题目所述, 为你的地图上的道路,你需要返回恰好 个pair
,代表一组合法的修建方案。一个 pair
代表一条通道,其成员 first
为入口,second
为出口。特别地,如果无解,请返回一个空vector
。
可调用函数:
std<span class="sh_symbol">::</span><span class="sh_usertype">vector<int> QueryLCA(const std::vector<int> &A, const std::vector<int></span><span class="sh_normal"> </span><span class="sh_symbol">&</span>B<span class="sh_symbol">,</span> <span class="sh_type">int</span> P<span class="sh_symbol">);</span>
该函数代表一次操作 , 的含义如上文所述。保证返回vector
的大小与A.size()
相同,值只包含 和 ,第 项(从 开始)为 当且仅当以 为根时 中街区的 为 。
<span class="sh_type">int</span> <span class="sh_function">GetDistance</span><span class="sh_symbol">(</span><span class="sh_type">int</span> x<span class="sh_symbol">,</span><span class="sh_type">int</span> y<span class="sh_symbol">);</span>
查询距离, 含义如上文所述。
<span class="sh_type">int</span> <span class="sh_function">getSubtaskID</span><span class="sh_symbol">();</span>
获取子任务编号。在样例交互库中该函数恒返回 。
保证城市在交互开始时已经确定,即交互库不自适应。
样例交互库
下发了 sample_grader.cpp
和 passageconstruction.h
,你可以使用命令 g++ sample_grader.cpp <your source file> -o passageconstruction -O2 -std=c++14
生成可执行文件。
注意评测时交互库与样例交互库有所不同。
输入格式
第一行一个数 ,含义如题目所述。
接下来 行,每行两个数,代表城市的一条道路。注意 需要满足前文所述的条件。
注意样例交互库不会检查输入文件是否合法,输入不合法时其行为未定义。
输出格式
交互库会在运行过程正常结束且答案正确时返回 ,答案错误或交互错误时返回 。
当答案错误或交互错误时的提示信息如下:
Index out of range
:街区编号不为 内的整数。
Invalid construction plan
:返回方案格式有误。
Condition not satisfied
:返回方案不满足上文的条件。
Invalid type 1 query
:执行操作 时未满足 的条件。
当答案正确时的提示信息如下:
Accepted with a+b operations, sum of size(s)=c+d
。其中 分别为操作 和操作 的次数,。
当无解时的提示信息如下:
Reported no solution with a+b operations, sum of size(s)=c+d
。 含义同上。
数据范围
记 为操作 次数, 为操作 次数,。
子任务编号 | 分值 | 上限 | 上限 | 上限 | 上限 | 特殊性质 | |
---|---|---|---|---|---|---|---|
1 | |||||||
2 | |||||||
3 | A | ||||||
4 | BC | ||||||
5 | B | ||||||
6 | C | ||||||
7 | |||||||
8 | |||||||
9 |
特殊性质 A:城市的每个街区至多与两条道路直接连接。
特殊性质 B:城市的每个街区至多与三条道路直接连接。
特殊性质 C:保证你拥有的地图上的所有道路仍然存在。
评分方式:在一个子任务内,如果 均 对应上限,该子任务得满分。
否则设对应上限分别为 ,令 $v=\max(\frac{C_1}{C_1^{Lim}},\frac{C_2}{C_2^{Lim}},\frac{S_1}{S_1^{Lim}},\frac{S_2}{S_2^{Lim}})$。如果 则该子任务得 分,否则该子任务得分为该子任务满分分值。
保证交互库运行时间在给定数据范围内 ,空间 。子任务 的时间限制为 ,其余子任务的时间限制为 。