luogu#P16453. [APIO 2026] Navigation
[APIO 2026] Navigation
背景
在洛谷评测本题,无需使用头文件 navigation.h。
题目描述
台湾省高山密度很高,拥有超过 250 座 3000 米以上的高峰。阿明计划在台湾省的中央山脉建造机器人滑索运送网络,用以在偏远村落之间运输包裹。
在阿明的计划中,每个网络由 个节点组成,编号从 到 。这些节点中,恰好 个是发电站,其余 个节点全是村庄节点。节点之间由 条双向电缆连接,电缆编号从 到 。对于每个 (),电缆 连接节点 和 。每条电缆连接两个不同的节点,且每对节点之间最多由一条电缆连接。保证可以借助电缆在任意两个节点之间移动。
节点 与 的距离记为 ,其定义如下。
- 若 ,则 。
- 否则, 是从 移动到 所需经过的最少电缆数。
如果网络中的每个节点要么恰好连接 条电缆,要么连接至少 条电缆,我们就称该网络的分支因子至少为 。阿明已知一个正整数 ,满足该网络的分支因子至少为 。
阿明准备了 种不同类型的电缆,编号为 。网络中的每条电缆都将采用其中一种类型进行建造。
机器人将沿着滑索电缆行驶以执行运送任务。阿明希望安装一套导航程序,帮助机器人返回发电站并给自己充电。然而,机器人的内存极低。因此,在设计导航程序时,机器人仅根据发电站数量 、保证的最低分支因子 以及连接到机器人当前位置的电缆类型来进行导航。
当机器人需要在一个连接了两条或更多电缆的村庄节点 处导航时,机器人首先以任意顺序扫描连接到 的电缆。随后,程序会收到一个列表,按该顺序包含这些电缆的类型。对于每条电缆,程序需要统计满足“沿着该电缆能缩短机器人与发电站之间距离”这一条件的发电站数量。
具体来说,设 ()是通过电缆直接连接到 的节点,()是连接节点 与 的电缆的类型。程序随后被提供 、 和列表 。对于每个 (),程序必须确定满足 的发电站 的数量。
你的任务是设计一套策略来分配电缆类型并编写导航程序。你的解决方案的得分取决于所用不同类型电缆的数量(详见子任务与计分部分)。
实现细节
你需要实现两个过程,一个用于分配电缆类型,另一个用于机器人的程序。
你需要实现的分配电缆类型的过程如下:
std::vector<int> construct_network(int N, int K, int B,
std::vector<int> U, std::vector<int> V,
std::vector<int> P)
- :节点的数量。
- :发电站的数量。
- :网络保证的最低分支因子。
- :长度为 的数组,描述电缆连接情况。
- :长度为 的数组,描述发电站所在的节点。
- 对于每个测试用例,该过程最多会被调用 次。
该过程应返回一个长度为 的数组 :
- 类型为 的电缆用于连接节点 和 。
- 每个元素 必须满足 。
你需要实现的机器人程序的过程如下:
std::vector<int> navigate(int K, int B, std::vector<int> C)
- :发电站的数量。
- :网络保证的最低分支因子。
- :连接到某个连接了至少 2 条电缆的村庄节点的所有电缆的类型列表,以任意顺序给出。
- 保证 的长度至少为 。
- 对于每个测试用例,该过程最多会被调用 次。
- 过程
navigate不得依赖于原始网络结构;特别地,评测系统可能会在同一个测试用例的不同构建网络之间,对所有navigate调用进行重排。
该过程应返回一个数组 :
- 数组 的长度必须与数组 相同。
- 必须是沿着 所对应的电缆移动后,能缩短机器人与发电站之间距离的发电站数量。
请注意,在评测系统中,construct_network 和 navigate 过程是在两个独立的进程中被调用的。
输入格式
样例评测器在同一个进程中调用 construct_network 和 navigate。此外,当样例评测器调用 navigate 时,电缆类型按照其在输入中出现的顺序列出。这两种行为均与实际评测器不同。
输入格式:
T
(场景 0)
(场景 1)
...
(场景 T-1)
每个场景的格式如下:
N
B
U[0] V[0]
U[1] V[1]
...
U[N-2] V[N-2]
K
P[0] P[1] ... P[K-1]
Q
X[0] X[1] ... X[Q-1]
在每个场景中,样例评测器会调用 navigate 共 次,第 次调用携带节点 的信息。请注意,样例评测器支持将 设为 以外的其他整数。
输出格式
如果 construct_network 或 navigate 返回的任一数组不合法,样例评测器将中止并打印原因。否则,样例评测器将每次 navigate 调用返回的数组 输出为一行。
当所有场景处理完毕后,样例评测器向标准错误输出一行:
S = S'
其中 是大于该测试用例中每次 construct_network 调用返回的数组 中所有数字的最小整数。
提示
样例
考虑这样一个场景:,,。
网络方案由 、 指定。发电站为 。考虑对第一个进程的如下调用:
construct_network(9, 6, 2, [0, 0, 0, 2, 2, 2, 2, 7],
[1, 2, 3, 4, 5, 6, 7, 8],
[1, 3, 4, 5, 6, 7])
假设阿明通过返回以下数组来构建网络:
[0, 10, 1, 2, 3, 4, 5, 5]
构建的网络如下图所示。
:::align{center}
:::
随后,在第二个进程中,假设机器人需要在节点 处导航。节点 连接到节点 、 和 。如果机器人按此顺序读取电缆类型,将会进行以下调用:
navigate(6, 2, [0, 10, 1])
根据网络结构:
- 第一个发电站,节点 ,到其自身距离最短。具体来说,。
- 第二个发电站,节点 ,到其自身距离最短。具体来说,。
- 其他发电站,节点 、、 和 ,到节点 的距离更短。具体来说,当 或 时,。
沿着电缆 、 和 移动后,距离缩短的发电站数量分别为 、 和 。因此,该过程应返回:
[1, 4, 1]
请注意,navigate 也可能以 的不同排列被调用。例如,对于节点 ,navigate(6, 2, [1, 0, 10]) 也是一种可能的调用。此时,过程应返回 [1, 1, 4]。
假设机器人需要在节点 处导航。将进行以下调用:
navigate(6, 2, [10, 2, 3, 4, 5])
过程应返回:
[2, 1, 1, 1, 1]
在此网络中,对于其他节点,navigate 过程将永不被调用,这是因为:
- 节点 、、、、 和 都是发电站,且
- 节点 只连接了一条电缆。
在此测试用例中,所用到的电缆类型为 、、、、、 和 。因此, 将用于确定得分。
除本例外,本题的附件包还包含另外两个供样例评测器使用的样例输入和输出。
数据范围
- 。
- 。
- 在每个测试用例中,所有
construct_network调用的 之和不超过 。 - 对于每个 ,有 。
- 可以借助电缆从任意节点移动到任意其他节点。
- 。
- 每个数组 是连接到某个连接了至少 条电缆的村庄节点的所有电缆的类型列表的一个排列。
- 在每个测试用例中,所有
navigate调用的数组 的长度之和不超过 。
子任务与计分
| 子任务 | 分值 | 附加约束 |
|---|---|---|
| 。 | ||
| ,对每个满足 的 ,有 。 | ||
| 。 | ||
| 。 | ||
| 。 |
在任何测试用例中,如果至少满足下列条件之一,则你对于该测试用例的解答得分为 (在 CMS 中报告为“输出不正确”):
- 任意一次
construct_network调用的返回值不合法。 - 任意一次
navigate调用的返回值不正确。
否则,令 为大于每次 construct_network 调用返回的数组 中所有数字的最小整数。换言之, 是使得所有构建的网络仅使用类型为 的电缆的最小整数。
你在每个子任务上的得分取决于 ,具体如下表:
| 条件 | 子任务 1 | 子任务 2 | 子任务 3 和 4 | 子任务 5 |
|---|---|---|---|---|
特别地,在子任务 、 和 中,如果你能做到 ,即可获得满分;在子任务 和 中,如果你能做到 ,即可获得满分。
翻译由 DeepSeek V4 Pro 完成