문제 링크
- http://icpc.me/1517
사용 알고리즘
- Merge Sort
시간복잡도
- O(NlgN)
풀이
전형적인 inversion counting 문제입니다. N이 최대 50만이므로 naive하게 O(N^2)로 돌리면 TLE를 받게 됩니다.
합병 정렬을 이용해 풀 수 있습니다.
위에 섞인 수열, 아래에 정렬된 수열을 놓고 선으로 이었을 때의 교차점의 개수와 Bubble Sort의 swap횟수는 동일합니다. 이 점을 이용해 Merge Sort를 이용해 문제를 풀어봅시다.
이 두 개의 배열을 merge한다고 합시다.
이렇게 교차가 되면서 정렬됩니다. merge 과정에서 교차 횟수를 세는 것은 여러 가지 방법으로 구현이 가능합니다.
그 중 한 가지 방법은 cnt와 ans변수를 두고
- 뒤에 있는 원소가 정렬된 상태를 저장하는 배열에 들어간 경우에 cnt를 1 증가시키고
- 앞에 있는 원소가 정렬된 상태를 저장하는 배열에 들어간 경우에는 ans에 cnt를 더하는 방식
으로 구현을 하면 됩니다.
합병 정렬에서 일어나는 모든 merge에서의 교차 횟수 총 합이 정답이 되고, O(N log N)만에 구할 수 있습니다.
전체 코드
1 |
|