(問題 2)Segment Treeの構築2 : 完全二分木について Clojure(Beta)編(paizaランク A 相当)
問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
問題
下記の問題をプログラミングしてみよう!
(はじめに)
完全二分木とは木の特殊系であり、問題 1 で扱った条件に加えて以下が成り立ちます。
頂点数はある正整数 k を用いて 2 ^ k - 1 と表せる。次数 2 である頂点が唯一存在し、その頂点を根とする。根からの距離を根との最短パス上の頂点数から 1 引いたものとする。根からの距離が k' であるものは、2 ^ k' 個存在する。では、下の木を見ていきましょう。左は完全二分木です。右は木であり、上の条件を満たしていますが、根との距離が 2 であるものが 3 つしかないので、完全二分木ではありません。

完全二分木も問題 1 同様隣接リスト等で管理できますが、配列でも管理することが出来ます。
配列で管理する方法は以下の通りです。0-indexedで表記します。完全二分木でそれぞれの頂点において、左側にある子を左の子、右側にあるのを右の子とします。
根を配列の 0 番目に格納する。それぞれの頂点において、その頂点が配列の i (0 ≦ i) 番目に格納されているとすると左の子を配列の 2 × i + 1 番目と右の子を 2 × i + 2 番目に格納する。
では、実際にやってみましょう。
(問題)
根が頂点 X である N 頂点の完全二分木が与えられます。i (1 ≦ i ≦ N - 1) 番目の辺は親 a_i と子 b_i を結んでいます。
上記の配列で管理する方法で管理した結果(配列)を出力してください。ただし、それぞれの頂点において入力順で最初に出てきた子を左の子、入力順で後に出てきた子を右の子としてください。
- 入力される値
-
入力は以下のフォーマットで与えられます。
N X
a_1 b_1
a_2 b_2
a_3 b_3
...
a_{N - 1} b_{N - 1}
1 行目には 2 つの整数 N,X が与えられます。
1 + i (1 ≦ i ≦ N - 1) 行目には 2 つの整数 a_i,b_i が与えられます。
入力は合計 N 行からなり、入力値最終行の末尾に改行を 1 つ含みます。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。
標準入力からの値取得方法はこちらをご確認ください
- 期待する出力
答えを 1 行で出力してください。
上記の方法で格納した長さ N の配列の要素を順に空白区切りで出力してください。
- 条件
-
すべてのテストケースについて以下の条件を満たします。
- 3 ≦ N ≦ 2047
- 0 ≦ X ≦ N - 1
- 0 ≦ a_i,b_i ≦ N - 1 (1 ≦ i ≦ N - 1)
- a_i ≠ b_i (1 ≦ i ≦ N - 1)
- i ≠ j なら (a_i, b_i) ≠ (a_j, b_j) かつ (a_i, b_i) ≠ (b_j, a_j)
- a_i (1 ≦ i ≦ N - 1) は a_i = X か a_i = b_j (j < i) のどちらかを満たす
- 与えられるグラフは完全二分木である
- 入力例1
-
7 6
6 4
4 5
6 2
2 1
2 0
4 3
問題一覧へ戻る