| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
|---|---|---|---|---|---|
| 1 초 | 1024 MB | 208 | 42 | 42 | 24.852% |
IOI 나라는 특이하게도 정$N$각형 모양의 섬에 세워졌다. $N$개의 각 꼭짓점에 해당하는 위치마다 지역이 있으며, 이 지역들은 반시계 순서로 0,ドル 1, \dots , N - 1$의 번호가 붙어 있다. IOI 나라의 도로망은 다음과 같은 두 종류의 도로로 이루어진다:
한편, $K$개의 지역을 잇는 어떤 도로망에 대해, 도로의 집합 $T$가 다음 조건을 만족할 때 $T$를 트리라고 한다.
트리는 모든 지역을 연결하므로 운송에서 매우 중요한 역할을 차지한다. 하지만, 트리의 도로를 사용할 수 없을 때 이용할 수 있는 또 다른 트리가 있다면 안정성에 크게 도움이 될 것이다. 이에 도로망에 두 트리 $T_1$와 $T_2$가 존재하여 $T_1 \cap T_2 = ∅$를 만족할 때, 즉 어떠한 도로도 겹치지 않는 두 트리가 존재할 때, 그 도로망을 좋은 도로망이라고 정의한다.
IOI 나라에서는 다음과 같이 새로운 지역과 도로를 건설하는 방안을 통해 좋은 도로망을 구축하고자 한다.
IOI 나라에서는 지역 건설을 여러 번 할 수 있지만, 가능한 적은 횟수의 지역 건설을 통해 겹치지 않는 두 트리가 존재하는 좋은 도로망으로 바꾸고자 한다. 좋은 도로망이 되기 위해서는 기존의 $N$개 지역뿐만 아니라 새로 건설된 지역도 연결하는 겹치지 않는 두 트리가 존재해야 함에 주의하라. 여러분은 IOI 나라를 도와 도로망 문제를 해결해야 한다. 지역 건설의 횟수를 최소화하지 않아도 부분 점수를 받을 수 있음에 유의하라.
여러분은 아래 함수들을 구현해야 한다.
void construct_two_trees(int N, std::vector<int> U, std::vector<int> V)
add_vertex 함수를 호출하여 지역을 건설하고, 도로를 공유하지 않는 두 트리를 찾아 report 함수를 호출하여야 한다.int add_vertex(int a, int b, int c)
report 함수가 한 번이라도 호출된 이후에는 호출되지 않아야 한다.void report(std::vector<std::array<int, 2> > tree)
construct_two_trees 함수에서 모든 add_vertex 함수의 호출이 종료된 후에 정확히 2ドル$회 호출되어야 한다.tree의 각 원소는 도로가 잇는 두 지역의 번호를 담고 있는 std::array<int, 2>여야 한다. 이 때, 두 지역의 번호의 순서는 어떻게 하여도 상관 없다.report($T_1$), report($T_2$)일 때, $T_1$과 $T_2$는 도로를 공유하지 않아야 하며 1ドル ≤ k ≤ 2$에 대해 $T_k$의 간선들만을 통해 add_vertex로 생긴 지역들을 포함해 모든 지역들을 오고갈 수 있어야 한다.제출하는 소스 코드의 어느 부분에서도 입출력 함수를 실행해서는 안 된다.
| 번호 | 배점 | 제한 |
|---|---|---|
| 1 | 6 | $N ≤ 5$ |
| 2 | 8 | 자신을 제외한 모든 지역과 직접 도로로 연결된 지역이 존재한다. |
| 3 | 14 | 초기 상태에서 지역 건설이 가능한 모든 지역 쌍 $(a, b, c)$에 대해, 서로를 잇는 3ドル$개의 도로 중 해변 도로가 1ドル$개 이상 존재한다. |
| 4 | 21 | $N ≤ 5,円 000$ |
| 5 | 51 | 추가적인 제약 조건이 없다. |
construct_two_trees 함수가 문제를 올바르게 해결하였을 때, add_vertex의 호출 횟수가 최솟값보다는 크지만 $N$을 넘지 않는 경우 각 부분문제에서 점수의 40ドル\%$를 획득한다. add_vertex를 $N$번보다 많이 호출하는 경우 점수를 얻지 못한다. 제약 조건 아래에서 add_vertex를 $N$번 이하로 호출하여 좋은 도로망을 구성할 수 있음은 증명할 수 있다.
$N = 4,ドル $U = [0],ドル $V = [2]$인 경우를 생각해 보자.
그레이더는 다음과 같이 함수를 호출한다.
construct_two_trees(4, [0], [2])
그 후 add_vertex(0, 2, 3)을 호출했을 떄, 도로망은 다음과 같은 상태이다.
그 후 report([[0,1],[0,2],[0,3],[4,2]])와 report([[4,0],[3,4],[2,3],[2,1]])을 차례로 호출하면 이는 올바르게 두 트리를 report한 실행이다. 호출한 두 트리를 각각 빨간색과 파란색으로 나타내면 아래 그림과 같다.
Sample grader는 아래와 같은 형식으로 입력을 받는다.
Sample grader는 다음과 같은 형식으로 출력한다.
먼저, report 함수가 호출될 때마다 그레이더는 다음과 같이 출력한다.
report의 $k$번째 호출임을 뜻한다.그 후, construct_two_trees 함수의 실행이 모두 종료된 뒤 그레이더는 add_vertex 함수의 호출에 대한 정보를 다음과 같이 출력한다
add_vertex 함수의 총 호출 횟수 $K$add_vertex 함수의 $i$번째 호출의 파라미터 $A[i]$ $B[i]$ $C[i]$Sample grader는 실제 채점에서 사용하는 그레이더와 다를 수 있음에 유의하라.
Olympiad > 국제정보올림피아드 대표학생 선발고사 > 2024 > 2차 선발고사 1번
C++17, C++20, C++17 (Clang), C++20 (Clang)