파일 업로드

학생 정렬

profile
실행 시간 제한메모리 제한
2 초512 MB
📃 해결할 문제

학교 선생님 미진은 아침 운동을 위해 학교 놀이터로 나가기 전에 NN (1N1051 \leq N \leq 10^5)명의 학생들을 번호순으로 정렬하려고 합니다. 번호는 편의상 1N1 \dots N으로 주어집니다.

현재 학생들은 p1,p2,p3,,pNp_1, p_2, p_3, \dots, p_N 순으로 줄을 서 있고,  미진은 p1p_1번 학생 앞에 서있습니다. 그는 학생들이 1,2,3,,N1, 2, 3, \dots, N 순으로 정렬되도록 순서를 바꾸길 원하며, 이때 11번 학생은 미진의 바로 옆에 있어야 합니다.

오늘 학생들은 조금 졸리기 때문에, 어느 시점에서든 지시에 주의를 기울이는 학생은 미진 바로 옆에 있는 학생뿐입니다. 한 시간 단계에서, 미진은 이 학생에게 줄에서 kk 칸 (11N1N-1 사이의 임의의 수) 아래로 이동하라고 지시할 수 있습니다. 이때, 이 학생이 지나치는 kk명의 학생들은 앞으로 걸어가면서 미진이 그 뒤에 줄에 끼어들 수 있는 공간을 확보합니다.

예를 들어, N=4N=4이고 학생들이 다음과 같은 순서로 시작한다고 가정해봅시다:

미진 : 4, 3, 2, 1

미진에 주의를 기울이는 유일한 학생은 4번 학생입니다. 만약 4번 학생에게 줄에서 2칸 아래로 가라고 지시한다면, 이후의 순서는 다음과 같을 것입니다:

미진 : 3, 2, 4, 1

이제 미진에게 주의를 기울이는 유일한 학생은 3번 학생입니다. 그래서 두 번째 시간 단계에서 3번 학생에게 지시를 내릴 수 있고, 이런 식으로 학생들이 정렬될 때까지 계속됩니다.

미진은 자신의 아침 운동을 위해 빨리 돌아가려 하기 때문에 정렬을 얼마나 빨리 마칠 수 있을지 알고 싶습니다. 학생들을 최소한의 시간 단위로 정렬할 수 있는 지시 순서를 찾아주세요.

💻 입력

입력의 첫 번째 줄에는 NN이 주어집니다. 두 번째 줄에는 NN개의 공백으로 구분된 정수가 주어집니다: p1,p2,p3,,pNp_1, p_2, p_3, \dots, p_N, 이는 학생의 초기 순서를 나타냅니다.

🖨️ 출력

첫 번째 줄에는 학생를 정렬하는 데 필요한 최소한의 시간 단계를 나타내는 정수 KK가 주어져야 합니다.

두 번째 줄에는 KK개의 공백으로 구분된 정수 c1,c2,,cKc_1, c_2, \dots, c_K가 주어져야 합니다. 각각의 정수는 범위 1N11 \ldots N-1에 속하며, 또한 ii번째 시간 단계에서 미진이 맞은 편에 서 있는 학생에게 cic_i만큼 줄을 따라 이동하도록 지시하면, KK개의 시간 단계 후에 학생들은 정렬된 순서대로 있어야 합니다.

여러 개의 최적의 지시 순서가 있는 경우, 프로그램은 이 중 아무 것이나 출력할 수 있습니다.


💻 예제 입력 1
4
1 2 4 3
🖨️ 예제 출력 1
3
2 2 3

출처: USACO 2019 January Contest, Gold Problem 2. Sleepy Cow Sorting