퀵 소트 cnt++

시간 제한2초메모리 제한1024 MB

요약
중간 인덱스의 피벗을 기준으로 나누고 작은 값과 큰 값에 대해서만 재귀하는 퀵소트가 수행하는 비교 횟수를 구한다.
난이도

보통10점 중 7점

유형
분할 정복, 재귀, 정렬, 이분 탐색
정답자
아직 제출이 없습니다

문제

아래 C++ 코드는 서로 다른 양의 정수 NN개를 정렬한다.

long long cnt = 0;

vector<int> sort(vector<int> &a) {
    vector<int> less, greater;
    if (a.size() <= 1) return a;
    int pivot = a[(a.size() - 1) / 2];
    int n = a.size();
    for (int i = 0; i < n; i++) {
        cnt += 1;
        if (a[i] < pivot) {
            less.push_back(a[i]);
        } else if (a[i] > pivot) {
            greater.push_back(a[i]);
        }
    }
    sort(less); sort(greater);
    vector<int> ans;
    ans.insert(ans.end(), less.begin(), less.end());
    ans.push_back(pivot);
    ans.insert(ans.end(), greater.begin(), greater.end());
    return ans;
}

서로 다른 자연수 NN개로 이루어진 배열 A가 주어질 때, 이 배열을 sort 함수로 정렬한 뒤 cnt에 들어 있는 값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 NN이 주어진다 (1≤N≤5000001 \le N \le 500000). 둘째 줄에는 배열 A에 들어 있는 수가 공백으로 구분되어 주어진다. 주어지는 수는 11부터 NN까지의 수로 이루어진 순열이다.

출력

입력으로 주어진 배열을 sort 함수로 정렬했을 때 cnt에 들어 있는 값을 출력한다.

예제3

  1. 예제 1

    입력
    5
    4 3 5 1 2
    
    예상 출력
    11
    
  2. 예제 2

    입력
    1
    1
    
    예상 출력
    0
    
  3. 예제 3

    입력
    2
    2 1
    
    예상 출력
    2