View problem - 공장들 (JOI14_factories)

Time limitMemory limit# of submissions# of submitted usersSolved #Accepted user ratio
8000 ms512 MiB467657950687.39%

IOI 왕국에서 00 이상 N1N-1 이하의 번호가 붙은 NN개의 도시들이 있습니다. 이들 도시들은 양방향으로 통행이 가능한 N1N-1개의 도로로 연결되어 있습니다. 여러분은 이러한 도로들을 몇 개 통과하여 어떤 서로 다른 두 다시 사이도 이동할 수 있습니다.

IOI 왕국에는 특별한 제품들을 생산하는 많은 회사들이 있습니다. 각 회사는 단 한 종류의 제품만 생산하며, 어떤 두 회사도 같은 종류의 제품을 생산하지 않습니다. 각 도시는 한 개 이상의 공장을 가지고 있습니다. 각 공장은 도시들 중 하나에 지어져 있습니다. 같은 도시에 두 개 이상의 회사가 공장을 가지고 있을 수도 있습니다.

가끔 어떤 회사는 또다른 회사의 제품이 필요할 때가 있습니다. 회사 CAC_{A}가 회사 CBC_{B}의 제품이 필요하다고 가정해 봅시다. (CACBC_{A} \neq C_{B}) 이 경우, 그들은 CBC_{B}에서 CAC_{A}로 제품을 운반해야 합니다. 이를 위해 회사 CBC_{B}의 아무 공장에서 회사 CAC_{A}의 아무 공장으로 제품을 운반하면 됩니다. 그들은 공장들 사이의 거리를 최소화하기 위하여 공장들을 적절히 선택해야 합니다.

해야 할 일

우선, 도시들의 수와 IOI 왕국의 도로의 정보가 주어집니다. 그 다음, QQ개의 질의가 주어집니다. 각 질의는 다음과 같은 형태로 주어집니다: Xj,0,,Xj,Sj1X_{j,0}, \cdots, X_{j, S_{j}-1}번 도시들에 공장을 가지고 있는 회사 UjU_{j}Yj,0,,Yj,Tj1Y_{j,0}, \cdots, Y_{j, T_{j}-1}번 도시들에 공장을 가지고 있는 회사 VjV_{j}의 제품이 필요합니다. 각 질의마다, 제품을 운반하기 위해 필요한 최소 거리를 반환하는 프로그램을 작성하세요.

구현 세부 사항

여러분은 질의에 답하는 프로그램을 구현해야 합니다. 여러분의 프로그램은 #include "factories.h"를 통하여 헤더 파일 factories.h를 포함해야 합니다. 여러분은 다음 함수들을 구현해야 합니다.

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

이 함수는 처음에 단 한 번 호출됩니다. N은 IOI 왕국의 도시의 수입니다. A, B, D는 길이가 N1N-1인 배열입니다. A[i], B[i]D[i]는 세 정수 AiA_{i}, BiB_{i}DiD_{i}입니다. (0iN20 \le i \le N-2) 이것은, 각 ii (0iN20 \le i \le N-2)에 대해, 도시 AiA_{i}와 도시 BiB_{i}를 연결하는 길이가 DiD_{i}인 도로가 존재한다는 것입니다.

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

이 함수는 각 QQ개의 쿼리에 대해 호출됩니다. jj번 쿼리에서, ST는 두 개의 정수 SjS_{j}TjT_{j}입니다. 이 숫자들은 회사 UjU_{j}VjV_{j}가 공장을 두고 있는 도시의 수입니다. X는 길이가 SjS_{j}인 배열입니다. UjU_{j}번 회사는 X[0], X[1], ..., X[S-1]번 도시에 공장을두고 있습니다. Y는 길이가 TjT_{j}인 배열입니다. VjV_{j}번 회사는 Y[0], Y[1], ..., Y[T-1]번 도시에 공장을두고 있습니다.

이 함수는 회사 VjV_{j}에서 회사 UjU_{j}로 제품을 운반하기 위한 최소 거리를 반환해야 합니다.

컴파일 및 실험

여러분은 factories.zip에서 여러분의 프로그램을 시험할 간단한 채점기를 내려받을 수 있습니다. 이 파일에는 여러분이 작성할 프로그램의 예시도 들어 있습니다.

간단한 채점기는 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가 생성됩니다. 실제 채점기는 제공된 채점기와는 다르다는 것을 참고하세요. 예제 채점기는 표준 입력에서 데이터를 읽어서 표준 출력에 그 결과를 출력합니다.

예제 채점기의 입력 형식

예제 채점기는 표준 입력에서 아래 데이터를 받습니다.

  • 첫 번째 줄에 두 개의 정수 NNQQ가 공백을 사이로 두고 주어집니다. 이는 IOI 왕국에 NN개의 도시가 있고, 여러분의 프로그램에게 QQ개의 질의가 주어진다는 것을 의미합니다.
  • 다음 (N1)(N-1)개줄 중 (i+1)(i+1)번째 줄 (0iN20 \le i \le N-2)에는 세 개의 정수 AiA_{i}, BiB_{i}, DiD_{i}가 공백을 사이로 두고 주어집니다. 이것은 도시 AiA_{i}와 도시 BiB_{i}를 잇는 길이가 DiD_{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_{j}TjT_{j}가 공백을 사이로 두고 주어집니다. 이것은 회사 UjU_{j}와 회사 VjV_{j} 각각 SjS_{j}개와 TjT_{j}개의 도시에 공장을 두고 있다는 것을 의미합니다.

(3j+2)(3j+2)번째 줄 (0jQ10 \le j \le Q-1)에는 SjS_{j}개의 정수 Xj,0,,Xj,Sj1X_{j,0}, \cdots, X_{j,S_{j}-1}이 공백을 사이로 두고 주어집니다. 이것은 회사 UjU_{j}가 도시 Xj,0,,Xj,Sj1X_{j,0}, \cdots, X_{j,S_{j}-1}에 공장을 두고 있다는 것을 의미합니다.

(3j+3)(3j+3)번째 줄 (0jQ10 \le j \le Q-1)에는 TjT_{j}개의 정수 Yj,0,,Xj,Tj1Y_{j,0}, \cdots, X_{j,T_{j}-1}이 공백을 사이로 두고 주어집니다. 이것은 회사 VjV_{j}가 도시 Yj,0,,Xj,Tj1Y_{j,0}, \cdots, X_{j,T_{j}-1}에 공장을 두고 있다는 것을 의미합니다.

예제 채점기의 출력 형식

프로그램이 성공적으로 종료되었다면, 예제 그레이더는 표준 출력Query에 의해 반환된 값들을 한 줄에 하나씩 차례대로 출력합니다.

제약 조건

모든 입력 데이터는 다음 조건을 만족합니다.

  • 2N500,0002 \le N \le 500,000
  • 1Q100,0001 \le Q \le 100,000
  • 0AiN10 \le A_{i} \le N-1 (0iN20 \le i \le N-2)
  • 0BiN10 \le B_{i} \le N-1 (0iN20 \le i \le N-2)
  • 1Di100,000,0001 \le D_{i} \le 100,000,000 (0iN20 \le i \le N-2)
  • AiBiA_{i} \neq B_{i} (1iN21 \le i \le N-2)
  • 여러분은 도로들을 통해 한 도시에서 다른 모든 도시로 이동할 수 있습니다.
  • 1SjN11 \le S_{j} \le N-1 (0jQ10 \le j \le Q-1)
  • 1Xj,kN11 \le X_{j,k} \le N-1 (0jQ1,0kSj10 \le j \le Q-1, 0 \le k \le S_{j}-1)
  • 1TjN11 \le T_{j} \le N-1 (0jQ10 \le j \le Q-1)
  • 1Yj,kN11 \le Y_{j,k} \le N-1 (0jQ1,0kTj10 \le j \le Q-1, 0 \le k \le T_{j}-1)
  • Xj,0,Xj,1,,Xj,Sj1,Yj,0,Yj,1,,Yj,Tj1X_{j,0},X_{j,1},\cdots,X_{j,S_{j}-1},Y_{j,0},Y_{j,1},\cdots,Y_{j,T_{j}-1}은 서로 다릅니다. (0jQ10 \le j \le Q-1)
  • S0+S1++SQ11,000,000S_{0} + S_{1} + \cdots + S_{Q-1} \le 1,000,000
  • T0+T1++TQ11,000,000T_{0} + T_{1} + \cdots + T_{Q-1} \le 1,000,000

서브태스크

서브태스크 1 [15점]

  • N5,000N \le 5,000
  • Q5,000Q \le 5,000

서브태스크 2 [18점]

  • Si10S_{i} \le 10 (0iQ10 \le i \le Q-1)
  • Ti10T_{i} \le 10 (0iQ10 \le i \le Q-1)

서브태스크 3 [67점]

추가 제약 조건이 없습니다.

예제 입력 및 출력

입력

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번 질의에서, 회사 U0U_{0}는 0번, 6번 도시에 공장을 두었고, 회사 V0V_{0}는 3번, 4번 도시에 공장을 두었습니다. 3번 도시에 있는 V0V_{0}의 공장에서부터 6번 도시에 있는 U0U_{0}의 공장까지의 거리가 최소입니다. 최소 거리는 12입니다.
  • 1번 질의에서, 회사 U1U_{1}는 0번, 1번, 3번 도시에 공장을 두었고, 회사 V1V_{1}는 4번, 6번 도시에 공장을 두었습니다. 6번 도시에 있는 V1V_{1}의 공장에서부터 1번 도시에 있는 U1U_{1}의 공장까지의 거리가 최소입니다. 최소 거리는 3입니다.
  • 2번 질의에서, 회사 U2U_{2}는 2번 도시에 공장을 두었고, 회사 V2V_{2}는 5번 도시에 공장을 두었습니다. 5번 도시에 있는 V2V_{2}의 공장에서부터 2번 도시에 있는 U2U_{2}의 공장까지의 거리가 최소입니다. 최소 거리는 11입니다.
Attachments
File nameSize
factories.zip2.50 KiB