Fake Plastic Trees
시간 제한1초메모리 제한1024 MB
앞서 만든 트리를 부분 트리로 재사용하면서 125개 이하의 균형 이진트리를 만들어, 그중 하나가 정확히 N개의 노드를 갖도록 구성한다.
문제
트리는 재귀적인 구조이며, 다음 중 하나이다.
- 빈 트리. 빈 트리는 로 표기하고 크기는 0이다.
- 비어 있지 않은 트리. 비어 있지 않은 트리 는 두 트리의 쌍 로 표기한다. 을 의 왼쪽 서브트리, 를 의 오른쪽 서브트리라고 한다. 이면 를 리프라고 한다. 리프의 크기는 1이고, 리프가 아닌 트리의 크기는 이다. 여기서 은 의 크기, 는 의 크기이다.
비어 있지 않은 트리 가 균형을 이루면 를 Fake Plastic Tree라고 한다. 구체적으로 일 때 또는 이면 는 Fake Plastic Tree이다.
컴퓨터 과학에서 트리는 자료 구조로 흔히 쓰이며 메모리에 저장된다. 처음에는 메모리에 트리가 없고, 가상의 널 포인터만 있다. 널 포인터는 빈 트리 에 대응한다. 과 를 널 포인터나 기존 트리의 포인터로 정하면 트리를 메모리에 할당할 수 있다. 그러면 메모리에 가 추가되면서 구조가 확장된다. 포인터는 작은 정수로 표현할 수 있으므로 트리 전체를 명시적으로 저장할 필요가 없다.
형식적으로 메모리 은 귀납적으로 정의되는 구조이며, 처음에는 빈 트리 만 포함한다. (.) 다음 연산으로 메모리를 확장할 수 있다. , 여기서 이다. 트리 가 번째 단계에서 삽입되면 는 인덱스 을 가진다. 인덱스 인 트리의 서브트리는 범위의 정수 쌍으로 나타낼 수 있다.
여러분의 과제는 다음 조건을 만족하는 메모리 을 구성하는 것이다.
- 의 모든 트리는 빈 트리이거나 Fake Plastic Tree이다.
- 은 비어 있지 않은 트리를 125개 이하로 가진다.
- 인 트리 이 존재한다. 은 정수이며 입력으로 주어진다.
입력
첫째 줄에 테스트 케이스의 수 가 주어진다. ()
다음 개 줄에 정수 이 하나씩 주어진다. 은 여러분의 트리가 가져야 하는 리프의 수이다. ()
출력
각 테스트 케이스마다 개 줄을 출력한다. 는 에 있는 비어 있지 않은 트리의 수이다. ()
첫째 줄에 정수 를 출력한다.
다음 개 줄에 두 정수 를 공백으로 구분해 출력한다. 이는 인덱스 인 트리의 왼쪽 서브트리와 오른쪽 서브트리의 인덱스이다. ()
번째 줄에 개의 노드를 가진 트리의 인덱스 를 출력한다. ()
주어진 조건에서 답이 항상 존재함이 보장된다.