#P15824. [JOI Open 2014] Factories

[JOI Open 2014] Factories

说明

在 IOI 王国中,有 NN 座城市,编号从 0 到 N1N-1。这些城市由 N1N-1 条双向通行的道路连接。你可以通过若干条道路从任意一座城市旅行到任意另一座城市。

IOI 王国中有许多生产特殊部件的公司。每家公司只生产一种部件。没有两家公司生产同一种部件。每家公司至少有一家工厂。每座工厂都建在某座城市中。可能有不止一家公司在同一座城市设有工厂。

有时,公司 CAC_A 需要另一家公司 CBC_BCACBC_A \ne C_B)的部件。在这种情况下,他们需要将部件从 CBC_B 运输到 CAC_A。他们可以从公司 CBC_B 的任意一家工厂运输到公司 CAC_A 的任意一家工厂。他们需要适当地选择工厂,以最小化工厂之间的距离。

任务

首先,给出 IOI 王国的城市数量和道路信息。然后,给出 QQ 个询问。每个询问的格式如下:在 Xj,0,,Xj,Sj1X_{j,0}, \dots, X_{j,S_j-1} 城市设有工厂的公司 UjU_j 需要公司 VjV_j 的部件,后者在 Yj,0,,Yj,Tj1Y_{j,0}, \dots, Y_{j,T_j-1} 城市设有工厂。请编写一个程序,对于每个询问,返回运输部件所需的最短距离。

实现细节

你需要编写一个程序,实现处理询问的各个过程。你的程序必须通过 #include "factories.h" 包含头文件 factories.h

你的程序需要实现以下过程。

  • void Init(int N, int A[], int B[], int D[])

    该过程在程序开始时仅被调用一次。参数 NN 是 IOI 王国的城市数量。参数 AABBDD 是长度为 N1N-1 的数组。元素 A[i]A[i]B[i]B[i]D[i]D[i] 分别是三个整数 AiA_iBiB_iDiD_i0iN20 \le i \le N-2)。这意味着,对于每个 ii0iN20 \le i \le N-2),存在一条长度为 DiD_i 的道路连接城市 AiA_i 和城市 BiB_i

  • long long Query(int S, int X[], int T, int Y[])

    该过程为每个询问(共 QQ 个)调用一次。在第 jj 个询问中,参数 SSTT 分别是两个整数 SjS_jTjT_j,代表公司 UjU_jVjV_j 各自拥有工厂的城市数量。参数 XX 是一个长度为 SjS_j 的数组,公司 UjU_j 在城市 X[0],X[1],,X[S1]X[0], X[1], \dots, X[S-1] 设有工厂。参数 YY 是一个长度为 TjT_j 的数组,公司 VjV_j 在城市 Y[0],Y[1],,Y[T1]Y[0], Y[1], \dots, Y[T-1] 设有工厂。该过程应返回将部件从公司 VjV_j 运输到公司 UjU_j 所需的最短距离。

编译与测试运行

你可以从竞赛网页下载一个归档文件,其中包含一个用于测试你程序的样例评分器。该归档文件还包含一个你的程序的样例源文件。

样例评分器由一个源文件组成,文件名为 grader.cgrader.cpp。例如,如果你的程序是 factories.cfactories.cpp,你可以运行以下命令来编译你的程序。

  • C

    gcc -O2 -std=c11 -o grader grader.c factories.c -lm
    
  • C++

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

编译成功后,会生成可执行文件 grader

请注意,实际评测使用的评分器与样例评分器不同。样例评分器将作为单个进程运行,它会从标准输入读取输入数据,并将结果写入标准输出。

输入格式

样例评分器从标准输入读取以下数据。

  • 第一行包含两个以空格分隔的整数 NNQQ,表示 IOI 王国有 NN 座城市,并且你的程序将处理 QQ 个询问。
  • 接下来的 (N1)(N-1) 行中,第 (i+1)(i+1) 行(0iN20 \le i \le N-2)包含三个以空格分隔的整数 AiA_iBiB_iDiD_i,表示存在一条长度为 DiD_i 的道路连接城市 AiA_i 和城市 BiB_i
  • 接下来的 3Q3Q 行中,第 jj 个询问的信息写在从第 (3j+1)(3j+1) 行到第 (3j+3)(3j+3) 行(0jQ10 \le j \le Q-1)。
  • (3j+1)(3j+1) 行(0jQ10 \le j \le Q-1)包含两个以空格分隔的整数 SjS_jTjT_j1SjN11 \le S_j \le N-11TjN11 \le T_j \le N-1),表示公司 UjU_jVjV_j 分别拥有 SjS_jTjT_j 家工厂所在的城市。
  • (3j+2)(3j+2) 行(0jQ10 \le j \le Q-1)包含 SjS_j 个以空格分隔的整数 Xj,0,,Xj,Sj1X_{j,0}, \dots, X_{j,S_j-1},表示公司 UjU_j 在城市 Xj,0,,Xj,Sj1X_{j,0}, \dots, X_{j,S_j-1} 设有工厂。
  • (3j+3)(3j+3) 行(0jQ10 \le j \le Q-1)包含 TjT_j 个以空格分隔的整数 Yj,0,,Yj,Tj1Y_{j,0}, \dots, Y_{j,T_j-1},表示公司 VjV_j 在城市 Yj,0,,Yj,Tj1Y_{j,0}, \dots, 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

提示

样例 1 解释

以上是样例评分器的输入输出样例。

  • 在询问 0 中,公司 U0U_0 在城市 0、6 设有工厂,公司 V0V_0 在城市 3、4 设有工厂。从公司 V0V_0 位于城市 3 的工厂到公司 U0U_0 位于城市 6 的工厂距离最短。最短距离为 12。
  • 在询问 1 中,公司 U1U_1 在城市 0、1、3 设有工厂,公司 V1V_1 在城市 4、6 设有工厂。从公司 V1V_1 位于城市 6 的工厂到公司 U1U_1 位于城市 1 的工厂距离最短。最短距离为 3。
  • 在询问 2 中,公司 U2U_2 在城市 2 设有工厂,公司 V2V_2 在城市 5 设有工厂。从公司 V2V_2 位于城市 5 的工厂到公司 U2U_2 位于城市 2 的工厂距离最短。最短距离为 11。

约束条件

所有输入数据满足以下条件。

  • 2N5000002 \le N \le 500000
  • 1Q1000001 \le Q \le 100000
  • 0AiN10 \le A_i \le N-10iN20 \le i \le N-2)。
  • 0BiN10 \le B_i \le N-10iN20 \le i \le N-2)。
  • 1Di1000000001 \le D_i \le 1000000000iN20 \le i \le N-2)。
  • AiBiA_i \ne B_i1iN21 \le i \le N-2)。
  • 你可以通过若干条道路从任意一座城市旅行到任意另一座城市。
  • 1SjN11 \le S_j \le N-10jQ10 \le j \le Q-1)。
  • 0Xj,kN10 \le X_{j,k} \le N-10jQ10 \le j \le Q-10kSj10 \le k \le S_j-1)。
  • 1TjN11 \le T_j \le N-10jQ10 \le j \le Q-1)。
  • 0Yj,kN10 \le Y_{j,k} \le N-10jQ10 \le j \le Q-10kTj10 \le k \le T_j-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}$ 互不相同(0jQ10 \le j \le Q-1)。
  • S0+S1++SQ11000000S_0 + S_1 + \cdots + S_{Q-1} \le 1000000
  • T0+T1++TQ11000000T_0 + T_1 + \cdots + T_{Q-1} \le 1000000

子任务

子任务 1 [15 分]

满足以下条件:

  • N5000N \le 5000
  • Q5000Q \le 5000

子任务 2 [18 分]

满足以下条件:

  • Si10S_i \le 100iQ10 \le i \le Q-1)。
  • Ti10T_i \le 100iQ10 \le i \le Q-1)。

子任务 3 [67 分]

  • 无额外约束。

翻译由 DeepSeek V3.2 完成