セグメント木メニューのサムネイル
(問題 2)Segment Treeの構築2 : 完全二分木について D(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

    出力例1

    6 4 2 5 3 1 0

    入力例2

    3 1
    1 0
    1 2

    出力例2

    1 0 2

    問題一覧へ戻る

    1. paizaラーニングトップ
    2. レベルアップ問題集
    3. セグメント木メニュー(言語選択)
    4. 問題一覧 D(Beta)編
    5. (問題 2)Segment Treeの構築2 : 完全二分木について D(Beta)編
    ページの先頭へ戻る