문제 링크
- http://icpc.me/8987
문제 출처
- 2013 KOI 고등부 4번
사용 알고리즘
- 그리디
- 세그먼트 트리
- DFS
시간복잡도
- $O(N log N) $
풀이
$K = 1$일 때는 물을 가장 많이 뺄 수 있는 곳에 구멍을 뚫는 것이 최적입니다.
$K > 1$일 때도 물을 가장 많이 뺄 수 있는 곳에 구멍을 계속해서 뚫는 것이 최적입니다. 그러나, $K > 1$인 경우에는 구멍을 뚫고 난 다음에, 각 수평 선분 별로 뺄 수 있는 물의 양을 갱신해야 하므로 귀찮습니다. 잘 처리하는 방법을 알아봅시다.
수평 선분 중 가장 위에 있는 것을 선택하면 구간을 둘로 나눌 수 있습니다.
구간을 둘로 나누는 것을 계속하면 이진 트리를 만들 수 있습니다. 이렇게 만들어지는 이진 트리에서 $[S, E]$를 관리하는 정점의 자식은 각각 $[S, K]$와 $[K+1, E]$를 관리합니다.
트리를 만들면서 해당 정점에서 뺄 수 있는 물의 양도 구할 수 있습니다. 각 정점에서 뺄 수 있는 물의 양을 우선 순위 큐에 넣고 가장 큰 K개를 선택해주면 됩니다.
구간을 둘로 나눌 때, 그 기준이 되는 곳은 세그먼트 트리를 이용해 구할 수 있습니다.
세그먼트 트리에 N번 쿼리를 날리고, 우선순위 큐에는 N번의 push연산과 K번의 pop연산을 날리기 때문에 $O(N log N)$에 문제를 풀 수 있습니다.
전체 코드
1 |
|