#P13989. 「RMI 2025」Engineers

    ID: 13195 传统题 2250ms 512MiB 尝试: 4 已通过: 1 难度: 9 上传者: 标签>CF2600树链剖分线段树LCA排序贪心数据结构背包DP

「RMI 2025」Engineers

完善以下代码

#include<bits/stdc++.h>

using namespace std;

int solve(int n,int d,vector<int> c,vector<int> ep,vector<int> eq){
}

signed main(){
	cin.tie(0),cout.tie(0);
	ios::sync_with_stdio(0);

	int n,d;
	cin>>n>>d;
	vector<int> c(n),ep(n-1),eq(n-1);
	for(int &x:c) cin>>x;
	for(int i=0;i<n-1;i++) cin>>ep[i]>>eq[i];

	cout<<solve(n,d,c,ep,eq)<<endl;

	return 0;
}

题目描述

Vianu 的年度服务器维护时间到了。有些维护工作可以由人工完成,但连接网络的电缆穿过一系列太小而无法进入的地下管道!幸运的是,一位才华横溢的工程师想出了一个主意:让受过训练的老鼠来检查计算机。

每只老鼠可以从一台计算机进入网络,沿着地下管道中的电缆行进,并从另一台计算机离开,沿途检查所有计算机。因为老鼠很懒,每只老鼠在累倒之前只会沿着起点和终点之间的一条简单路径行进。

维护人员希望老鼠检查一些计算机,以便在剩余未检查的计算机中,安全代码的配置是足够平衡的。你的任务是确定所需的最少老鼠数量。

NN 台计算机,编号从 00N1N-1,通过 N1N-1 条电缆连接。网络是一棵树(连通且无环)。

一只老鼠可以检查它进入网络的计算机和它离开的计算机之间唯一的简单路径上的所有计算机。形式上,如果一只老鼠在计算机 SS 进入并在计算机 TT 离开(S,T{0,,N1}S, T \in \{0, \ldots, N-1\}),那么老鼠将检查满足以下条件的所有计算机 v1,v2,,vkv_{1}, v_{2}, \ldots, v_{k}

  • v1=Sv_{1}=Svk=Tv_{k}=T
  • 对于所有 1i<k1 \leq i < k,计算机 viv_{i}vi+1v_{i+1} 通过电缆直接相连,
  • kk 是最小的。

老鼠可以重复使用相同的电缆和计算机,一台计算机也可以被多只老鼠检查。

每台计算机 i{0,,N1}i \in \{0, \ldots, N-1\} 都有一个关联的正整数代码 Ci1C_{i} \geq 1。维护人员设定了一个最大可接受差值 DD。在所有老鼠完成工作后,设剩余未检查的计算机集合为 R{0,,N1}R \subseteq \{0, \ldots, N-1\}。工作人员希望确保对于 RR 中的任意一对 i,ji, j,都有 CiCjD|C_{i}-C_{j}| \leq D

换句话说,剩余计算机中最大代码和最小代码之间的差值必须不超过 DD

每只老鼠在累倒之前只能检查一条路径。你希望最小化使用的老鼠数量。

实现细节

你应该实现以下函数:

int solve(int N, int D, std::vector<int> C, std::vector<int> P, std::vector<int> Q)

此函数接收以下参数:

  • NN:计算机的数量。
  • DD:最大可接受差值。
  • CC:计算机的代码。
  • 两个长度为 N1N-1 的向量 PPQQ:表示对于所有 0iN10 \leq i \leq N-1,计算机 PiP_{i}QiQ_{i} 之间有一条电缆。

函数应返回所需的最少老鼠数量,以便在所有老鼠检查完路径后,剩余未检查的计算机满足:

$$\max _{i \in R} C_{i}-\min _{i \in R} C_{i} \leq D$$
5 
aabaabacbbaabaa

7

8 
aaaaaaaaaaaaaaaaaaa

4

数据范围与提示

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

  • 1N2000001 \leq N \leq 200000
  • 对于所有 0iN10 \leq i \leq N-1,满足 1Ci10000000001 \leq C_{i} \leq 1000000000
  • 1D10000000001 \leq D \leq 1000000000
  • 0pi,qi<N,piqi0 \leq p_{i}, q_{i} < N, p_{i} \neq q_{i},且所有对 (pi,qi)(p_{i}, q_{i}) 都是不同的。

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

子任务 分值 附加限制
11 77 N20N \leq 20 且对于所有 0iN10 \leq i \leq N-1,满足 1Ci501 \leq C_{i} \leq 50
22 66 N1000N \leq 1000 且对于所有 0iN10 \leq i \leq N-1,满足 1Ci10001 \leq C_{i} \leq 1000
33 1111 N1000N \leq 1000
44 1616 对于所有 0i<N10 \leq i < N-1,满足 pi=0,qi=i+1p_{i}=0, q_{i}=i+1
55 2626 N50000N \leq 50000
66 3434 无附加限制。