문제 링크
- http://icpc.me/7469
문제 출처
- 2004 NEERC Northern Subregional K번
사용 알고리즘
- Segment tree
- Merge Sort Tree
시간복잡도
- O(n log n + m log3 n)
풀이
이 문제는 segment Tree로 해결할 수 있는 문제입니다.
이 문제를 풀면서 나오는 Segment Tree의 형태가 Merge Sort의 진행 과정과 유사하다 해서 Merge Sort Tree라고 부르기도 합니다.
입력된 숫자들을 세그먼트 트리를 이용해 관리를 합니다. 트리의 각 노드는 대응하는 구간의 원소들을 정렬한 배열을 키값으로 갖습니다.
전에 올린 풀이들은 노드들이 상수를 키값으로 가졌지만, 이 문제에서는 배열을 키값으로 갖습니다.
이런 식으로 merge sort tree 형태를 갖게 됩니다.
이제 k번째 수를 찾아봅시다.
먼저, 특정 구간에서 k번째 수가 x라면 아래 두 가지를 만족합니다.
- 해당 구간에 x 이하의 수는 k개 이상 존재
- 해당 구간에 x 미만의 수는 k개 미만 존재
어떤 구간에서 x 이하의 수의 개수는 다음과 같이 재귀적으로 구할 수 있습니다.
- 원하는 구간과 현재 탐색 중인 구간이 전혀 교차하지 않는다면, 0개
- 원하는 구간이 현재 탐색 중인 구간을 완전히 포함한다면, 현재 탐색 중인 구간에서 이진 탐색
- 일부만 교차한다면, 2개의 자식 노드에 대해 재귀적으로 위에 있는 두 연산을 수행
이러한 방식으로 답을 구한다면, 정렬을 하는데 O(n log n)이 걸리고, O(log3 n)만에 k번째 수를 찾을 수 있습니다.
따라서 전체 시간 복잡도는 O(n log n + m log3 n)입니다.
전체 코드
1 |
|