레몬향의 마흐트, 뎅켄의 스승이자 칠붕현 중 한 명. 그는 모든 것을 레몬으로 바꾸는 마법으로 유명하다. 대마법사 프리렌은 레몬으로 변해 버린 뎅켄의 고향을 원래대로 되돌리기 위해, 마흐트의 마법을 해주(解呪)해야 한다.
마흐트의 마법진은 번까지 번호가 붙은 개의 정점으로 이루어져 있고 루트가 인 트리의 형태이다. 각 간선은 자식에서 부모로 향하는 유향 간선이다. 번째 간선은 번 정점에서 번 정점으로 향하는 방향의 용량 를 갖는 간선이다.
프리렌이 해주를 성공시키기 위해서는 모든 간선 중 최소 용량을 찾아야 한다. 즉, 의 최솟값을 구해야 한다. 하지만 프리렌은 , , 만 알 뿐, 는 알지 못한다. 따라서 그녀는 마력 조작을 통해 정보를 얻어야 한다.
프리렌은 최대 번까지 마력 조작을 할 수 있으며, 한 번의 조작은 다음과 같이 이루어진다.
- 몇몇 간선을 선택하여 그 용량 를 으로 강화한다.
- 각 정점에 흘려보낼 마력량을 정한다. 즉, 길이 의 배열 을 정의하고, 번 정점에 만큼의 마력을 흘려보낸다. 이때 정점 에 흐르는 마력 는 다음과 같이 계산된다.
여기서 는 에서 로 향하는 간선을 의미하고, 는 그 간선의 용량이다.
조작이 끝난 후 프리렌은 루트 정점 에 흐르는 마력 만을 알 수 있다. 또한 각 마력 조작은 서로 독립적으로 수행되며, 조작이 끝나면 마법진은 즉시 원상태로 복구된다. 프리렌을 도와 마흐트의 마법을 해주하기 위해, 모든 간선 중 용량의 최솟값을 찾아라.
Implementation Details
함수 구현에 앞서 #include "macht.h" 를 통해 "macht.h" 헤더 파일을 포함해야 한다.
당신은 다음 함수를 구현해야 한다.
void unravel(std::vector<int> U, std::vector<int> V)
- : 마법진의 간선을 나타내는 길이 의 배열
- 이 함수는 하나의 테스트 케이스에 대해 단 한 번만 호출된다.
- 이 함수 안에서 아래
trigger함수를 이용해 마력 조작을 할 수 있다.
long long trigger(std::vector<int> R, std::vector<int> F);
- : 각 간선의 강화 여부를 의미하는 길이 의 배열 ()
- 이면 번 간선을 강화한다.
- : 각 정점에 흘릴 마력량을 의미하는 길이 의 배열 ()
- 이 함수는 루트 정점 에 흐르는 마력량 을 반환한다.
- 만약 위 조건을 어기면 을 반환한다.
- 이 함수는 최대 회 호출할 수 있다.
- 최종적으로, 해답을 제출하기 위해 아래 함수를 호출해야 한다.
void answer(int min_W);
- : 최소 용량의 값 (즉, ) ()
- 단 한 번만 호출해야 한다.
Constraints
- .
- ().
- .
Subtasks
Samples
다음과 같은 호출을 생각하자.
unravel(3, [0, 0], [1, 2])
다음은 가능한 함수 호출 순서 중 하나이다.
함수 호출 | 반환값 |
| |
| |
|
두 번째 trigger 호출 결과로부터, 번 간선 (정점 과 를 잇는 간선)의 가중치가 정확히 임을 알 수 있다.
또한 첫 번째 trigger 호출 결과와 이 정보를 조합하면, 번 간선 (정점 과 를 잇는 간선)의 가중치는 이상이어야 함을 알 수 있다. 만약 그렇지 않았다면, 루트에 흐르는 마력의 값은 보다 작게 나왔을 것이다.
따라서 모든 간선 가운데 최소 용량은 임을 확정할 수 있다.
Sample Grader
Sample grader의 입력 형식은 아래와 같다.
Sample grader는 다음을 출력한다.
- :
trigger함수가 호출된 횟수 - :
answer함수로 제출한 값
Sample grader는 실제 채점에서 사용하는 그레이더와 다를 수 있음에 유의하라.