#P15824. [JOI Open 2014] Factories

    ID: 17891 远端评测题 6000ms 512MiB 尝试: 0 已通过: 0 显示难度暂无评定 上传者: 标签>2014交互题JOI(日本)

[JOI Open 2014] Factories

题目描述

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

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

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

任务

首先,给出 IOI 王国的城市数量和道路信息。然后,给出 QQ 个询问。每个询问的格式如下:在 Xj,0,…,Xj,Sj−1X_{j,0}, \dots, X_{j,S_j-1} 城市设有工厂的公司 UjU_j 需要公司 VjV_j 的部件,后者在 Yj,0,…,Yj,Tj−1Y_{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 王国的城市数量。参数 AA、BB 和 DD 是长度为 N−1N-1 的数组。元素 A[i]A[i]、B[i]B[i] 和 D[i]D[i] 分别是三个整数 AiA_i、BiB_i 和 DiD_i(0≤i≤N−20 \le i \le N-2)。这意味着,对于每个 ii(0≤i≤N−20 \le i \le N-2),存在一条长度为 DiD_i 的道路连接城市 AiA_i 和城市 BiB_i。

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

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

编译与测试运行

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

样例评分器由一个源文件组成,文件名为 grader.c 或 grader.cpp。例如,如果你的程序是 factories.c 或 factories.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。

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

输入格式

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

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

约束条件

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

  • 2≤N≤5000002 \le N \le 500000。
  • 1≤Q≤1000001 \le Q \le 100000。
  • 0≤Ai≤N−10 \le A_i \le N-1(0≤i≤N−20 \le i \le N-2)。
  • 0≤Bi≤N−10 \le B_i \le N-1(0≤i≤N−20 \le i \le N-2)。
  • 1≤Di≤1000000001 \le D_i \le 100000000(0≤i≤N−20 \le i \le N-2)。
  • Ai≠BiA_i \ne B_i(1≤i≤N−21 \le i \le N-2)。
  • 你可以通过若干条道路从任意一座城市旅行到任意另一座城市。
  • 1≤Sj≤N−11 \le S_j \le N-1(0≤j≤Q−10 \le j \le Q-1)。
  • 0≤Xj,k≤N−10 \le X_{j,k} \le N-1(0≤j≤Q−10 \le j \le Q-1,0≤k≤Sj−10 \le k \le S_j-1)。
  • 1≤Tj≤N−11 \le T_j \le N-1(0≤j≤Q−10 \le j \le Q-1)。
  • 0≤Yj,k≤N−10 \le Y_{j,k} \le N-1(0≤j≤Q−10 \le j \le Q-1,0≤k≤Tj−10 \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}$ 互不相同(0≤j≤Q−10 \le j \le Q-1)。
  • S0+S1+⋯+SQ−1≤1000000S_0 + S_1 + \cdots + S_{Q-1} \le 1000000。
  • T0+T1+⋯+TQ−1≤1000000T_0 + T_1 + \cdots + T_{Q-1} \le 1000000。

子任务

子任务 1 [15 分]

满足以下条件:

  • N≤5000N \le 5000。
  • Q≤5000Q \le 5000。

子任务 2 [18 分]

满足以下条件:

  • Si≤10S_i \le 10(0≤i≤Q−10 \le i \le Q-1)。
  • Ti≤10T_i \le 10(0≤i≤Q−10 \le i \le Q-1)。

子任务 3 [67 分]

  • 无额外约束。

翻译由 DeepSeek V3.2 完成