예쁘게 출력한 이진 트리

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

요약
중위 순회 순서로 번호를 매긴 이진 트리를 평면에 그렸을 때 각 노드의 점수 A_i가 주어지면, 부모 배열 B_i를 복원하거나 불가능하면 -1을 출력한다.
난이도

어려움10점 중 9점

유형
트리, 분할 정복, 스택, 재귀
정답자
아직 제출이 없습니다

문제

당신에게는 노드 개수가 NN인 이진 트리가 있다. 당신은 이 이진 트리를 중위 순회하는 순서대로 노드들의 번호를 11부터 차례대로 매겼다. 그리고 부모가 위, 자식이 아래에 위치하게끔 왼쪽에서 오른쪽으로 번호 순서대로 늘어놓았다. 아래 그림은 그렇게 이진 트리를 늘어놓은 예시이다. 이때, ii번 노드의 점수 A_iA\_i를 다음과 같이 정의한다:

  • 해당 노드의 위로 직선을 그었을 때, 해당 직선과 만나는 간선의 수 (단, 자기 자신과 부모를 잇는 간선이 존재하는 경우 그 간선도 반드시 개수에 포함한다)

노드의 개수 NN과 노드들의 점수 A_iA\_i가 주어졌을 때, 이진 트리를 복원해 보자. 답이 최대 한 가지만 존재함을 증명할 수 있다.

입력

첫 번째 줄에 노드의 개수를 나타내는 정수 NN이 주어진다. 두 번째 줄에 각 노드의 점수를 나타내는 NN개의 정수 A_1,A_2,⋯ ,A_NA\_1,A\_2,\cdots ,A\_N이 공백으로 구분되어 주어진다.

출력

해당 점수를 갖는 이진 트리가 있는 경우는 첫 번째 줄에 NN개의 정수 B_1,B_2,⋯ ,B_NB\_1,B\_2,\cdots ,B\_N을 공백으로 구분해 출력한다.

B_iB\_i는 ii번 노드의 부모 노드의 번호이다. ii번 노드의 부모 노드가 없는 경우 B_i=0B\_i=0이다.

해당 점수를 갖는 이진 트리가 없는 경우는 첫 번째 줄에 -1을 대신 출력한다.

제한

  • 1≤N≤200,0001\le N\le 200\\, 000
  • 1≤i≤N1\le i\le N
  • 0≤A_i≤N−10\le A\_i\le N-1

힌트

루트가 xx인 이진 트리를 중위 순회하는 순서대로 방문하는 함수 f(x)f(x)를 다음과 같이 정의할 수 있다.

  1. xx의 왼쪽 자식 노드 x_lx\_l이 존재한다면 f(x_l)f(x\_l)을 수행한다. 존재하지 않는다면 아무것도 하지 않는다.
  2. xx를 방문한다.
  3. xx의 오른쪽 자식 노드 x_rx\_r이 존재한다면 f(x_r)f(x\_r)을 수행한다. 존재하지 않는다면 아무것도 하지 않는다.

예제2

  1. 예제 1

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

    입력
    2
    0 0
    
    예상 출력
    -1