#lg14716. [RMI 2025] 电缆维护 / Engineers
[RMI 2025] 电缆维护 / Engineers
#5572. 「RMI 2025」Engineers
标签: 传统 | 时间限制: 2250 ms | 内存限制: 512 MiB |
注意事项
在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:
- C++(标准为 C++ 17 及以上)
请在提交源代码前添加 #include "engineers.h"。
题目描述
题目译自 Romanian Master of Informatics 2025 Day1 T1 「Engineers」
Vianu 的年度服务器维护时间到了。有些维护工作可以由人工完成,但连接网络的电缆穿过一系列太小而无法进入的地下管道!幸运的是,一位才华横溢的工程师想出了一个主意:让受过训练的老鼠来检查计算机。
每只老鼠可以从一台计算机进入网络,沿着地下管道中的电缆行进,并从另一台计算机离开,沿途检查所有计算机。因为老鼠很懒,每只老鼠在累倒之前只会沿着起点和终点之间的一条简单路径行进。
维护人员希望老鼠检查一些计算机,以便在剩余未检查的计算机中,安全代码的配置是足够平衡的。你的任务是确定所需的最少老鼠数量。
有 台计算机,编号从 到 ,通过 条电缆连接。网络是一棵树(连通且无环)。
一只老鼠可以检查它进入网络的计算机和它离开的计算机之间唯一的简单路径上的所有计算机。形式上,如果一只老鼠在计算机 进入并在计算机 离开(),那么老鼠将检查满足以下条件的所有计算机 :
- 且 ,
- 对于所有 ,计算机 和 通过电缆直接相连,
- 是最小的。
老鼠可以重复使用相同的电缆和计算机,一台计算机也可以被多只老鼠检查。
每台计算机 都有一个关联的正整数代码 。维护人员设定了一个最大可接受差值 。在所有老鼠完成工作后,设剩余未检查的计算机集合为 。工作人员希望确保对于 中的任意一对 ,都有 。
换句话说,剩余计算机中最大代码和最小代码之间的差值必须不超过 。
每只老鼠在累倒之前只能检查一条路径。你希望最小化使用的老鼠数量。
实现细节
你应该实现以下函数:
int solve(int N, int D, std::vector<int> C, std::vector<int> P, std::vector<int> Q)
此函数接收以下参数:
- :计算机的数量。
- :最大可接受差值。
- :计算机的代码。
- 两个长度为 的向量 和 :表示对于所有 ,计算机 和 之间有一条电缆。
函数应返回所需的最少老鼠数量,以便在所有老鼠检查完路径后,剩余未检查的计算机满足:
$$\max _{i \in R} C_{i}-\min _{i \in R} C_{i} \leq D$$样例 1
输入
5
aabaabacbbaabaa
输出
7
在第一个样例中,有 台计算机和 。网络图示如下:

样例 2
输入
8
aaaaaaaaaaaaaaaaaaa
输出
4
数据范围与提示
对于所有输入数据,满足:
- 。
- 对于所有 ,满足 。
- 。
- ,且所有对 都是不同的。
详细子任务附加限制及分值如下表所示。
| 子任务 | 分值 | 附加限制 |
|---|---|---|
| 且对于所有 ,满足 。 | ||
| 且对于所有 ,满足 。 | ||
| 。 | ||
| 对于所有 ,满足 。 | ||
| 。 | ||
| 无附加限制。 |