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

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

순환 반단조 순열

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

요약
각 n에 대해, 중간 원소가 항상 극소 또는 극대이고 순열을 포인터 사상으로 볼 때 하나의 순환이 되는 1부터 n까지의 순열 중 사전순으로 가장 작은 것을 출력한다.
난이도

어려움10점 중 9점

유형
조합론, 수학, 그리디, 구현
정답자
아직 제출이 없습니다

문제

11부터 nn까지의 정수가 각각 정확히 한 번씩 나타나는 정수 수열을 순열이라고 한다. 이 문제에서는 다음 두 조건을 모두 만족하는 순열 p1,p2,…,pnp_1, p_2, \dots, p_n 을 다룬다.

  1. 반단조(antimonotonic): 1<i<n1 < i < n 을 만족하는 모든 위치 ii 에 대해, pip_i 는 이웃한 세 값 pi−1,pi,pi+1p_{i-1}, p_i, p_{i+1} 중에서 가장 작거나 가장 커야 한다.
  2. 순환(cyclic): pip_i 를 위치 ii 에서 위치 pip_i 로 향하는 포인터로 생각하자. 위치 11 에서 출발하여 포인터를 따라가면, 위치 11 로 되돌아오기 전에 nn 개의 위치를 모두 방문할 수 있어야 한다. 즉, 순열이 길이 nn 짜리 하나의 순환만으로 이루어져야 한다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 순열의 길이인 정수 nn (3≤n≤1063 \le n \le 10^6) 하나가 적힌 한 줄로 주어진다. 입력의 끝은 n=0n = 0 인 줄로 표시하며, 이 줄은 처리하지 않는다.

출력

각 테스트 케이스마다, 반단조이면서 순환인 11 부터 nn 까지의 순열 중 사전순으로 가장 앞서는(가장 작은) 것을 한 줄에 출력한다. 두 순열 aa 와 bb 를 비교할 때는 수열 a1,a2,…,ana_1, a_2, \dots, a_n 과 b1,b2,…,bnb_1, b_2, \dots, b_n 을 앞에서부터 차례로 비교하여, 처음으로 값이 달라지는 위치에서 더 작은 값을 가지는 쪽을 더 앞선 것으로 본다. 한 줄 안의 정수들은 공백 하나로 구분한다.

예제5

  1. 예제 1

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

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

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

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

    입력
    7
    0
    
    예상 출력
    2 4 1 6 3 7 5