시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
2 초 | 512 MB | 50 | 11 | 10 | 26.316% |
자카르타의 제일 큰 놀이동산에는 N 가지 놀이기구가 있는데, 0부터 N - 1까지 번호가 매겨져 있다. 이 탈 것들은 N - 1개의 양방향 도로로 연결되어 있어서, 어떤 두 놀이기구를 골라도 이 둘을 잇는 유일한 경로가 존재한다. 이 도로는 0부터 N - 2까지 번호가 매겨져 있다. i번 도로는 놀이기구 A[i]와 놀이기구 B[i]를 연결하고 걸어서 이동하는데 한 시간이 걸린다. 혼잡을 막기 위해서, 모든 놀이기구는 최대 3개의 도로와 연결되어 있다.
모든 놀이기구를 정확하게 한 번 방문하는 행로(tour)를 만들려고 한다. 한 놀이기구에서 다른 놀이기구로 이동할 때 여러 도로를 지나가는 것은 지루하다. 즐거운 행로를 만들려면, 모든 놀이기구에 대해서 순서 관계를 정해서, 다음 놀이기구를 방문하는데 필요한 시간이 직전 놀이기구를 방문하는데 필요한 시간보다 길지 않게 하고 싶다. 다른 말로 하면, 0부터 N - 1까지 모든 정수가 정확하게 한 번씩 나오는 순열 P[0], P[1], …, P[N − 1]을 찾으려 하는데, 모든 0 < i < N − 1에 대해서 놀이기구 P[i]에서 놀이기구 P[i + 1]로 이동하는데 걸리는 시간이 놀이기구 P[i - 1]에서 놀이기구 P[i]로 이동하는데 걸리는 시간보다 길지 않다.
당신은 놀이기구의 전체 지도를 가지고 있지 않다. 따라서, 즐거운 행로를 만들려면 안내센터에 질문을 여러번 해야 한다. 최대 Q번 질문할 수 있고, 각각의 질문은 두 파라미터 X와 Y로 이루어지는데, 0 ≤ X, Y < N이다. 각 질문은 다음 둘 중 하나이다.
다음 createFunTour
함수를 구현해야 한다.
createFunTour(N, Q)
- 이 함수는 그레이더에 의해서 정확하게 한 번 호출된다.
hoursRequired(X, Y)
attractionsBehind(X, Y)
다음 예제에서, N = 7, Q = 400000, A = [0, 0, 0, 1, 1, 2], B = [1, 5, 6, 2, 4, 3]이다. 이 예제는 다음 그림으로 설명할 수 있다.
그레이더는 createFunTour(7, 400000)
를 호출한다.
hoursRequired(3, 5)
로 질의하면, 리턴값은 4이다.hoursRequired(5, 4)
로 질의하면, 리턴값은 3이다.attractionsBehind(5, 1)
로 질의하면, 리턴값은 4이다. 놀이기구 5에서 놀이기구 1, 2, 3, 4로 가려면 놀이기구 1을 반드시 지나가야 한다. attractionsBehind(1, 5)
로 질의하면, 리턴값은 1이다.hoursRequired(T, i)
< 30를 만족하면서 다음 조건을 만족하는 구간 [L[i], R[i]] (0 ≤ L[i] ≤ i ≤ R[i] < N)이 존재하는 놀이도구 T가 최소한 하나 존재한다.
샘플 그레이더는 입력을 다음 양식으로 읽는다.
N Q A[0] B[0] A[1] B[1] . . . A[N-2] B[N-2]
샘플 그레이더는 만약 createFunTour
함수가 즐거운 행로를 표현하는 N개의 정수의 순열을 저장한 배열을 정확히 구하고, hoursRequired
, attractionsBehind
함수의 호출 횟수 합이 Q이하이면 이 배열을 출력한다. 그렇지 않으면, 오답 메시지를 출력한다.
공개된 그레이더, 예제 케이스, 문제에 대한 기본 파일은 여기에서 받을 수 있다.
C++17, Java 8, C++14, Java 8 (OpenJDK), Java 11, C++20, C++14 (Clang), C++17 (Clang), C++20 (Clang)