버블 정렬

시간 제한1초메모리 제한128 MB

요약
배열에서 한 쌍의 원소를 정확히 한 번 교환한 뒤, 주어진 버블 정렬이 수행하는 교환 횟수의 최솟값을 구한다.
난이도

어려움10점 중 8점

유형
정렬, 누적 합, 그리디
정답자
아직 제출이 없습니다

문제

버블 정렬은 아래 의사 코드로 표현되는 가장 단순한 정렬 알고리즘 중 하나이다. 이 코드에서는 이웃한 두 원소의 순서가 잘못되어 서로 맞바꿀 때마다 교환 횟수가 1씩 증가한다.

void bubble_sort(int *a, int n) {
    int i, j;
    for (i = 0; i < n - 1; ++i) {
        for (j = 0; j < n - 1; ++j) {
            if (a[j] > a[j + 1]) {
                /* 순서가 잘못된 쌍이므로 두 원소를 맞바꾼다. */
                /* 이때 교환 횟수가 1 증가한다. */
                int x = a[j];
                a[j] = a[j + 1];
                a[j + 1] = x;
            }
        }
    }
}

길이가 nn인 배열 AA가 주어졌을 때, 배열 A∗A^*를 다음과 같이 정의한다. 두 인덱스 ii, jj (1≤i<j≤n1 \le i < j \le n)를 골라 AA의 ii번째 원소와 jj번째 원소를 정확히 한 번 맞바꾼 배열이 A∗A^*이다.

가능한 모든 A∗A^* 중에서, 위 버블 정렬을 수행했을 때의 교환 횟수가 가장 작은 값을 출력하라.

입력

첫째 줄에 정수 NN이 주어진다. 이어지는 NN개의 줄에 배열 AA의 원소가 A1,A2,…,ANA_1, A_2, \ldots, A_N 순서로 한 줄에 하나씩 주어진다.

출력

모든 A∗A^* 중 버블 정렬 교환 횟수가 최소가 되는 값을 한 줄에 출력한다.

제한

  • 1≤N≤100,0001 \le N \le 100{,}000
  • 1≤Ai≤1,000,000,0001 \le A_i \le 1{,}000{,}000{,}000

예제3

  1. 예제 1

    입력
    5
    10
    3
    6
    8
    1
    
    예상 출력
    0
    
  2. 예제 2

    입력
    5
    3
    1
    7
    9
    5
    
    예상 출력
    2
    
  3. 예제 3

    입력
    3
    1
    2
    3
    
    예상 출력
    1