메뉴 건너뛰기

문제


시간메모리제출 통과 비율
1초64MB
0
0
0.0%
나의 횟수나의 판정시도 성공 비율
00
0.0%
문제

길이 \(N\)인 수열 \(A = [A_1, A_2, \ldots, A_N]\)이 주어진다. 다음 연산을 0번 이상 수행할 수 있다.

  1. 양의 정수 \(x\)를 하나 고른다.
  2. 수열 \(A\)에서 값이 \(x\) 이하인 원소를 원래 순서대로 뽑아 부분수열 \(B\)를 만든다.
  3. 수열 \(A\)에서 값이 \(x\)보다 큰 원소를 원래 순서대로 뽑아 부분수열 \(C\)를 만든다.
  4. 수열 \(A\)를 \(B\)와 \(C\)를 이어 붙인 수열로 바꾼다.

수열 \(A\)를 비내림차순(\(A_1 \le A_2 \le \cdots \le A_N\))으로 정렬하는 데 필요한 연산 횟수의 최솟값을 구하는 프로그램을 작성하라. 제약 조건을 만족하는 모든 입력에 대해, 주어진 연산만으로 수열을 정렬할 수 있음이 보장된다.

입력

입력은 다음 형식으로 주어진다.

\(N\)

\(A_1\) \(A_2\) \(\cdots\) \(A_N\)

제약 조건

  • 주어지는 모든 수는 정수이다.
  • \(1 \le N \le 300{,}000\)
  • \(1 \le A_i \le N\) (\(1 \le i \le N\))

부분문제

  1. (6점) \(A_i \le 2\) (\(1 \le i \le N\))
  2. (15점) \(N \le 15\)
  3. (23점) \(N \le 100\)
  4. (27점) \(N \le 750\)
  5. (33점) \(A_i \ne A_j\) (\(1 \le i < j \le N\))
  6. (46점) 추가 제약 조건 없음
출력

다음 형식으로 출력한다.

수열 \(A\)를 비내림차순으로 정렬하는 데 필요한 연산 횟수의 최솟값을 출력한다.

예시 1
입력
6 3 4 5 1 2 6
출력
1
설명

\(x = 2\)를 고르면 부분수열 \(B = [1, 2]\), \(C = [3, 4, 5, 6]\)이 되어 \(A = [1, 2, 3, 4, 5, 6]\)으로 정렬된다. 따라서 1번의 연산으로 정렬할 수 있다.

예시 2
입력
9 1 5 9 9 5 1 1 5 9
출력
2
설명

다음과 같이 2번의 연산으로 정렬할 수 있다.

  1. \(x = 3\)을 고르면 \(B = [1, 1, 1]\), \(C = [5, 9, 9, 5, 5, 9]\)이 되어 \(A = [1, 1, 1, 5, 9, 9, 5, 5, 9]\)가 된다.
  2. \(x = 7\)을 고르면 \(B = [1, 1, 1, 5, 5, 5]\), \(C = [9, 9, 9]\)이 되어 \(A = [1, 1, 1, 5, 5, 5, 9, 9, 9]\)가 된다.

1번 이하의 연산으로는 정렬할 수 없음을 증명할 수 있다.

위로