说明
在 IOI 王国中,有 N 座城市,编号从 0 到 N−1。这些城市由 N−1 条双向通行的道路连接。你可以通过若干条道路从任意一座城市旅行到任意另一座城市。
IOI 王国中有许多生产特殊部件的公司。每家公司只生产一种部件。没有两家公司生产同一种部件。每家公司至少有一家工厂。每座工厂都建在某座城市中。可能有不止一家公司在同一座城市设有工厂。
有时,公司 CA 需要另一家公司 CB(CA=CB)的部件。在这种情况下,他们需要将部件从 CB 运输到 CA。他们可以从公司 CB 的任意一家工厂运输到公司 CA 的任意一家工厂。他们需要适当地选择工厂,以最小化工厂之间的距离。
任务
首先,给出 IOI 王国的城市数量和道路信息。然后,给出 Q 个询问。每个询问的格式如下:在 Xj,0,…,Xj,Sj−1 城市设有工厂的公司 Uj 需要公司 Vj 的部件,后者在 Yj,0,…,Yj,Tj−1 城市设有工厂。请编写一个程序,对于每个询问,返回运输部件所需的最短距离。
实现细节
你需要编写一个程序,实现处理询问的各个过程。你的程序必须通过 #include "factories.h" 包含头文件 factories.h。
你的程序需要实现以下过程。
-
void Init(int N, int A[], int B[], int D[])
该过程在程序开始时仅被调用一次。参数 N 是 IOI 王国的城市数量。参数 A、B 和 D 是长度为 N−1 的数组。元素 A[i]、B[i] 和 D[i] 分别是三个整数 Ai、Bi 和 Di(0≤i≤N−2)。这意味着,对于每个 i(0≤i≤N−2),存在一条长度为 Di 的道路连接城市 Ai 和城市 Bi。
-
long long Query(int S, int X[], int T, int Y[])
该过程为每个询问(共 Q 个)调用一次。在第 j 个询问中,参数 S 和 T 分别是两个整数 Sj 和 Tj,代表公司 Uj 和 Vj 各自拥有工厂的城市数量。参数 X 是一个长度为 Sj 的数组,公司 Uj 在城市 X[0],X[1],…,X[S−1] 设有工厂。参数 Y 是一个长度为 Tj 的数组,公司 Vj 在城市 Y[0],Y[1],…,Y[T−1] 设有工厂。该过程应返回将部件从公司 Vj 运输到公司 Uj 所需的最短距离。
编译与测试运行
你可以从竞赛网页下载一个归档文件,其中包含一个用于测试你程序的样例评分器。该归档文件还包含一个你的程序的样例源文件。
样例评分器由一个源文件组成,文件名为 grader.c 或 grader.cpp。例如,如果你的程序是 factories.c 或 factories.cpp,你可以运行以下命令来编译你的程序。
编译成功后,会生成可执行文件 grader。
请注意,实际评测使用的评分器与样例评分器不同。样例评分器将作为单个进程运行,它会从标准输入读取输入数据,并将结果写入标准输出。
输入格式
样例评分器从标准输入读取以下数据。
- 第一行包含两个以空格分隔的整数 N、Q,表示 IOI 王国有 N 座城市,并且你的程序将处理 Q 个询问。
- 接下来的 (N−1) 行中,第 (i+1) 行(0≤i≤N−2)包含三个以空格分隔的整数 Ai、Bi、Di,表示存在一条长度为 Di 的道路连接城市 Ai 和城市 Bi。
- 接下来的 3Q 行中,第 j 个询问的信息写在从第 (3j+1) 行到第 (3j+3) 行(0≤j≤Q−1)。
- 第 (3j+1) 行(0≤j≤Q−1)包含两个以空格分隔的整数 Sj 和 Tj(1≤Sj≤N−1,1≤Tj≤N−1),表示公司 Uj 和 Vj 分别拥有 Sj 和 Tj 家工厂所在的城市。
- 第 (3j+2) 行(0≤j≤Q−1)包含 Sj 个以空格分隔的整数 Xj,0,…,Xj,Sj−1,表示公司 Uj 在城市 Xj,0,…,Xj,Sj−1 设有工厂。
- 第 (3j+3) 行(0≤j≤Q−1)包含 Tj 个以空格分隔的整数 Yj,0,…,Yj,Tj−1,表示公司 Vj 在城市 Yj,0,…,Yj,Tj−1 设有工厂。
输出格式
程序成功终止后,样例评分器会将每次 Query 调用返回的值按行写入标准输出,每行一个。
7 3
0 1 4
1 2 4
2 3 5
2 4 6
4 5 5
1 6 3
2 2
0 6
3 4
3 2
0 1 3
4 6
1 1
2
5
12
3
11
提示
样例 1 解释
以上是样例评分器的输入输出样例。
- 在询问 0 中,公司 U0 在城市 0、6 设有工厂,公司 V0 在城市 3、4 设有工厂。从公司 V0 位于城市 3 的工厂到公司 U0 位于城市 6 的工厂距离最短。最短距离为 12。
- 在询问 1 中,公司 U1 在城市 0、1、3 设有工厂,公司 V1 在城市 4、6 设有工厂。从公司 V1 位于城市 6 的工厂到公司 U1 位于城市 1 的工厂距离最短。最短距离为 3。
- 在询问 2 中,公司 U2 在城市 2 设有工厂,公司 V2 在城市 5 设有工厂。从公司 V2 位于城市 5 的工厂到公司 U2 位于城市 2 的工厂距离最短。最短距离为 11。
约束条件
所有输入数据满足以下条件。
- 2≤N≤500000。
- 1≤Q≤100000。
- 0≤Ai≤N−1(0≤i≤N−2)。
- 0≤Bi≤N−1(0≤i≤N−2)。
- 1≤Di≤100000000(0≤i≤N−2)。
- Ai=Bi(1≤i≤N−2)。
- 你可以通过若干条道路从任意一座城市旅行到任意另一座城市。
- 1≤Sj≤N−1(0≤j≤Q−1)。
- 0≤Xj,k≤N−1(0≤j≤Q−1,0≤k≤Sj−1)。
- 1≤Tj≤N−1(0≤j≤Q−1)。
- 0≤Yj,k≤N−1(0≤j≤Q−1,0≤k≤Tj−1)。
- $X_{j,0}, X_{j,1}, \dots, X_{j,S_j-1}, Y_{j,0}, Y_{j,1}, \dots, Y_{j,T_j-1}$ 互不相同(0≤j≤Q−1)。
- S0+S1+⋯+SQ−1≤1000000。
- T0+T1+⋯+TQ−1≤1000000。
子任务
子任务 1 [15 分]
满足以下条件:
- N≤5000。
- Q≤5000。
子任务 2 [18 分]
满足以下条件:
- Si≤10(0≤i≤Q−1)。
- Ti≤10(0≤i≤Q−1)。
子任务 3 [67 分]
翻译由 DeepSeek V3.2 完成