A2881 「JOI Open 2014 Day 1」工厂

暂无评定 传统题 交互JOI(日本) 上传者
时间限制6000ms
内存限制512MiB
通过 / 提交0/0

A2881「JOI Open 2014 Day 1」工厂

暂无评定 传统题 交互JOI(日本) 上传者
时间限制6000ms
内存限制512MiB
通过 / 提交0/0

注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 11 及以上)

题目描述

译自 JOI Open 2014 Day1 T1「工場 / Factories」

在 IOI 王国,有 NN 个城市,编号从 00 到 N−1N-1。这些城市由 N−1N-1 条双向道路相连。你可以通过这些道路从任何一个城市到达另一个城市。

在 IOI 王国,有许多公司生产特殊的零件。每个公司只生产一种零件。没有两个公司生产相同的零件。每个公司至少有一个工厂。每个工厂建在一个城市里。同一个城市里可能有多个公司的工厂。

在某些情况下,一个公司需要另一个公司的零件。假设公司 CAC_{A} 需要公司 CB (CA≠CB)C_{B}\ (C_{A} \neq C_{B}) 的零件,他们需要将零件从 CBC_{B} 运输到 CAC_{A}。他们可以从公司 CBC_{B} 的任何一个工厂运输零件到公司 CAC_{A} 的任何一个工厂。他们需要合理地选择工厂,以使工厂之间的距离最小。

给出 IOI 王国的城市数和道路的信息。有 QQ 个询问。每个询问的形式如下:公司 UjU_{j} 在城市 Xj,0,…,Xj,Sj−1X_{j, 0}, \ldots, X_{j, S_{j}-1} 有工厂,公司 VjV_{j} 在城市 Yj,0,…,Yj,Tj−1Y_{j, 0}, \ldots, Y_{j, T_{j}-1} 有工厂。公司 UjU_{j} 需要公司 VjV_{j} 的零件。编写一个程序,对于每个询问,返回运输零件的最小距离。

实现细节

你需要编写一个程序,实现回答询问的函数。你的程序应该包含头文件 factories.h,你的程序应该实现以下函数。

  • $\texttt{void Init(int N, int A[], int B[], int D[])}$

    这个函数只在开始时调用一次。

    • 参数 N\texttt{N} 表示 IOI 王国的城市数。
    • 参数 A,B,D\texttt{A,B,D} 是长度为 N−1N-1 的数组。元素 A[i],B[i],D[i]\texttt{A[i],B[i],D[i]} 分别代表 Ai,Bi,Di (0≤i≤N−2)A_{i},B_{i},D_{i}\ (0 \leq i \leq N-2)。表示对于每个 i (0≤i≤N−2)i\ (0 \leq i \leq N-2),有一条长度为 DiD_{i} 的道路连接城市 AiA_{i} 和城市 BiB_{i}。
  • $\texttt{long long Query(int S, int X[], int T, int Y[])}$

    这个函数对于每个 QQ 个询问都会被调用。在询问 jj 中:

    • 参数 S\texttt{S} 和 T\texttt{T} 是两个整数 SjS_{j} 和 TjT_{j},分别表示公司 Uj,VjU_{j}, V_{j} 的工厂所在城市的数量。
    • 参数 X\texttt{X} 是一个长度为 SjS_{j} 的数组,表示公司 UjU_{j} 在城市 $\texttt{X}[0], \texttt{X}[1], \ldots, \texttt{X}[\texttt{S}-1]$ 有工厂。
    • 参数 Y\texttt{Y} 是一个长度为 TjT_{j} 的数组,表示公司 VjV_{j} 在城市 $\texttt{Y}[0], \texttt{Y}[1], \ldots, \texttt{Y}[\texttt{T}-1]$ 有工厂。
    • 这个函数应该返回从公司 VjV_{j} 到公司 UjU_{j} 运输零件的最小距离。

编译和测试运行

你可以从「文件」页面下载样例交互器并测试你的程序。「文件」页面也包含一个样例源文件。

样例交互器是文件 grader.cpp。为了测试你的程序,你需要将 grader.cpp,factories.cpp 和 factories.h 三个文件放在同一文件夹下,并运行如下命令编译你的程序。

g++ -02 -std=c++11 -o grader grader.cpp factories.cpp

当编译成功后,会产生一个可执行文件 grader。

请注意实际的交互器和样例交互器不同。样例交互器会以单进程的形式执行,它会从标准输入中读入,并输出结果到标准输出。

样例交互器输入

第一行包含两个用空格分隔的整数 N,QN, Q,表示IOI王国有 NN 个城市,给你的程序有 QQ 个询问。

接下来的 N−1N-1 行中的第 i+1 (0≤i≤N−2)i+1\ (0 \leq i \leq N-2) 行包含三个用空格分隔的整数 Ai,Bi,DiA_{i}, B_{i}, D_{i},表示有一条长度为 DiD_{i} 的道路连接城市 AiA_{i} 和城市 BiB_{i}。

接下来的 3Q3Q 行中,从第 3j+1 (0≤j≤Q−1)3j+1\ (0 \leq j \leq Q-1) 行到第 3j+33j+3 行包含第 jj 个询问的信息。

第3j+1 (0≤j≤Q−1)3j+1\ (0 \leq j \leq Q-1) 行包含两个用空格分隔的整数 Sj (1≤Sj≤N−1)S_{j}\ (1 \leq S_{j} \leq N-1) 和 Tj (1≤Tj≤N−1)T_{j}\ (1 \leq T_{j} \leq N-1),表示公司 UjU_{j} 和 VjV_{j} 分别在 SjS_{j} 和 TjT_{j} 个城市有工厂。

第 3j+2 (0≤j≤Q−1)3j+2\ (0 \leq j \leq Q-1) 行包含 SjS_{j} 个用空格分隔的整数 Xj,0,…,Xj,Sj−1X_{j, 0}, \ldots, X_{j, S_{j}-1},表示公司 UjU_{j} 在城市 Xj,0,…,Xj,Sj−1X_{j, 0}, \ldots, X_{j, S_{j}-1} 有工厂。

第 3j+3 (0≤j≤Q−1)3j+3\ (0 \leq j \leq Q-1) 行包含TjT_{j} 个用空格分隔的整数 Yj,0,…,Yj,Tj−1Y_{j, 0}, \ldots, Y_{j, T_{j}-1},表示公司 VjV_{j} 在城市 Yj,0,…,Yj,Tj−1Y_{j, 0}, \ldots, Y_{j, T_{j}-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

这些是样例评测器的样例输入和样例输出。

  • 在查询 00 中,公司 U0U_{0} 在城市 0,60,6 有工厂,公司 V0V_{0} 在城市 3,43,4 有工厂。从公司 V0V_{0} 在城市 33 的工厂到公司 U0U_{0} 在城市 66 的工厂的距离最小。最小距离是 1212。
  • 在查询 11 中,公司 U1U_{1} 在城市 0,1,30,1,3 有工厂,公司 V1V_{1} 在城市 4,64,6 有工厂。从公司 V1V_{1} 在城市 66 的工厂到公司 U1U_{1} 在城市 11 的工厂的距离最小。最小距离是 33。
  • 在查询 22 中,公司 U2U_{2} 在城市 22 有工厂,公司 V2V_{2} 在城市 55 有工厂。从公司 V2V_{2} 在城市 55 的工厂到公司 U2U_{2} 在城市 22 的工厂的距离最小。最小距离是 1111。

数据范围与提示

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

  • 2≤N≤5×1052 \leq N \leq 5\times 10^5
  • 1≤Q≤1051 \leq Q \leq 10^5
  • 0≤Ai≤N−1 (0≤i≤N−2)0 \leq A_{i} \leq N-1\ (0 \leq i \leq N-2)
  • 0≤Bi≤N−1 (0≤i≤N−2)0 \leq B_{i} \leq N-1\ (0 \leq i \leq N-2)
  • 1≤Di≤109 (0≤i≤N−2)1 \leq D_{i} \leq 10^9\ (0 \leq i \leq N-2)
  • Ai≠Bi (1≤i≤N−2)A_{i} \neq B_{i}\ (1 \leq i \leq N-2)
  • 你可以通过这些道路从任何一个城市到达另一个城市
  • 1≤Sj≤N−1 (0≤j≤Q−1)1 \leq S_{j} \leq N-1\ (0 \leq j \leq 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)1 \leq T_{j} \leq N-1\ (0 \leq j \leq 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)(0 \leq j \leq Q-1)
  • S0+S1+⋯+SQ−1≤106S_{0}+S_{1}+\cdots+S_{Q-1} \leq 10^6
  • T0+T1+⋯+TQ−1≤106T_{0}+T_{1}+\cdots+T_{Q-1} \leq 10^6

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

子任务 附加限制 分值
11 N,Q≤5000N,Q\leq 5000 1515
22 Si,Ti≤10 (0≤i≤Q−1)S_{i},T_{i} \leq 10\ (0 \leq i \leq Q-1) 1818
33 无附加限制 6767