题目描述
译自 JOI Open 2014 Day1 T1「工場 / Factories」
在 IOI 王国,有 N 个城市,编号从 0 到 N−1。这些城市由 N−1 条双向道路相连。你可以通过这些道路从任何一个城市到达另一个城市。
在 IOI 王国,有许多公司生产特殊的零件。每个公司只生产一种零件。没有两个公司生产相同的零件。每个公司至少有一个工厂。每个工厂建在一个城市里。同一个城市里可能有多个公司的工厂。
在某些情况下,一个公司需要另一个公司的零件。假设公司 CA 需要公司 CB (CA=CB) 的零件,他们需要将零件从 CB 运输到 CA。他们可以从公司 CB 的任何一个工厂运输零件到公司 CA 的任何一个工厂。他们需要合理地选择工厂,以使工厂之间的距离最小。
给出 IOI 王国的城市数和道路的信息。有 Q 个询问。每个询问的形式如下:公司 Uj 在城市 Xj,0,…,Xj,Sj−1 有工厂,公司 Vj 在城市 Yj,0,…,Yj,Tj−1 有工厂。公司 Uj 需要公司 Vj 的零件。编写一个程序,对于每个询问,返回运输零件的最小距离。
实现细节
你需要编写一个程序,实现回答询问的函数。你的程序应该包含头文件 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.cpp。为了测试你的程序,你需要将 grader.cpp,factories.cpp 和 factories.h 三个文件放在同一文件夹下,并运行如下命令编译你的程序。
g++ -O2 -std=c++11 -o grader grader.cpp factories.cpp
当编译成功后,会产生一个可执行文件 grader。
请注意实际的交互器和样例交互器不同。样例交互器会以单进程的形式执行,它会从标准输入中读入,并输出结果到标准输出。
样例交互器输入
第一行包含两个用空格分隔的整数 N, Q,表示IOI王国有 N 个城市,给你的程序有 Q 个询问。
接下来的 N−1 行中的第 i+1 (0≤i≤N−2) 行包含三个用空格分隔的整数 Ai, Bi, Di,表示有一条长度为 Di 的道路连接城市 Ai 和城市 Bi。
接下来的 3Q 行中,从第 3j+1 (0≤j≤Q−1) 行到第 3j+3 行包含第 j 个询问的信息。
第 3j+1 (0≤j≤Q−1) 行包含两个用空格分隔的整数 Sj (1≤Sj≤N−1) 和 Tj (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
这些是样例评测器的样例输入和样例输出。
- 在查询 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≤5×105
- 1≤Q≤105
- 0≤Ai≤N−1 (0≤i≤N−2)
- 0≤Bi≤N−1 (0≤i≤N−2)
- 1≤Di≤109 (0≤i≤N−2)
- Ai=Bi (1≤i≤N−2)
- 你可以通过这些道路从任何一个城市到达另一个城市
- 1≤Sj≤N−1 (0≤j≤Q−1)
- $0 \leq X_{j, k} \leq N-1\ (0 \leq j \leq Q-1,0 \leq k \leq S_{j}-1)$
- 1≤Tj≤N−1 (0≤j≤Q−1)
- $0 \leq Y_{j, k} \leq N-1\ (0 \leq j \leq Q-1,0 \leq k \leq T_{j}-1)$
- $X_{j, 0}, X_{j, 1}, \ldots, X_{j, S_{j}-1}, Y_{j, 0}, Y_{j, 1}, \ldots, Y_{j, T_{j}-1}$ 彼此不同 (0≤j≤Q−1)
- S0+S1+⋯+SQ−1≤106
- T0+T1+⋯+TQ−1≤106
详细子任务附加限制及分值如下表所示。
| 子任务 |
附加限制 |
分值 |
| 1 |
N,Q≤5000 |
15 |
| 2 |
Si,Ti≤10 (0≤i≤Q−1) |
18 |
| 3 |
无附加限制 |
67 |