아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

스왑

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

요약
순열이 주어질 때 각 k = 2..n에서 위치 k와 floor(k/2)를 바꿀지 정해, 만들 수 있는 순열 중 사전순으로 가장 앞선 것을 구한다.
난이도

보통10점 중 6점

유형
그리디, 트리, 구현
정답자
아직 제출이 없습니다

문제

11부터 nn까지의 정수가 한 번씩 나타나는 길이 nn의 수열 x1,x2,…,xnx_1, x_2, \dots, x_n이 주어진다.

두 수를 바꾸는 "스왑" 연산으로 이 수열을 고칠 수 있다. k=2,3,…,nk = 2, 3, \dots, n 순서로 kk를 하나씩 늘려 가면서, 각 kk마다 xkx_k와 x⌊k/2⌋x_{\lfloor k/2 \rfloor}를 바꿀지 바꾸지 않을지 고를 수 있다. 이미 지나간 kk로는 돌아가지 못한다.

수열 a1,a2,…,ana_1, a_2, \dots, a_n이 수열 b1,b2,…,bnb_1, b_2, \dots, b_n보다 사전순으로 앞선다는 것은, k<jk < j인 모든 kk에 대해 ak=bka_k = b_k이고 aj<bja_j < b_j인 jj (1≤j≤n)(1 \le j \le n)가 존재한다는 뜻이다.

순서대로 "스왑" 연산을 골라 만들 수 있는 수열 중 사전순으로 가장 앞선 수열은 무엇일까?

입력

첫 줄에 정수 nn이 주어진다. (1≤n≤5000)(1 \le n \le 5000)

둘째 줄에 수열을 이루는 nn개의 정수가 공백으로 구분되어 주어진다. 이 수열은 11부터 nn까지의 정수를 한 번씩 담은 순열이다.

출력

첫 줄에 순서대로 "스왑" 연산을 골라 만들 수 있는 수열 중 사전순으로 가장 앞선 수열을 나타내는 nn개의 정수를 공백으로 구분해 출력한다.

예제3

  1. 예제 1

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

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

    입력
    12
    8 2 12 1 10 9 3 5 7 4 6 11
    
    예상 출력
    2 1 3 5 4 9 12 8 7 10 6 11