AT_apc001_h Generalized Insertion Sort
Description
[problemUrl]: https://atcoder.jp/contests/apc001/tasks/apc001_h
$ N $ 頂点の根つき木が与えられます。 頂点には番号 $ 0,\ 1,\ ...,\ N-1 $ がついており、根は頂点 $ 0 $ です。 そして、頂点 $ i(i\ =\ 1,\ 2,\ ...,\ N-1) $ の親は頂点 $ p_i $ です。
はじめ、頂点 $ i $ には整数 $ a_i $ が書かれています。 なお、$ (a_0,\ a_1,\ ...,\ a_{N-1}) $ は $ (0,\ 1,\ ...,\ N-1) $ の順列になっています。
あなたは以下の操作を $ 25,000 $ 回まで好きな回数実行できます。頂点 $ i $ に書かれた値が $ i $ となるようにしてください。
- 頂点を $ 1 $ 個選び $ v $ とする。頂点 $ 0 $ と頂点 $ v $ の間のパスを考える。
- パス上の頂点の値を回転させる。つまり、パス上の各辺 $ (i,\ p_i) $ について、頂点 $ p_i $ に書かれた値を頂点 $ i $ に(この操作の直前に)書かれていた値に書き換え、頂点 $ v $ の値は頂点 $ 0 $ に(この操作の直前に)書かれていた値に書き換える。
- なお、頂点 $ 0 $ を選んでもよいが、この場合はなにもしないという操作になる。
Input Format
入力は以下の形式で標準入力から与えられる。
> $ N $ $ p_1 $ $ p_2 $ ... $ p_{N-1} $ $ a_0 $ $ a_1 $ ... $ a_{N-1} $
Output Format
$ 1 $ 行目に操作の回数 $ Q $ を出力せよ。 $ 2 $ 行目から $ Q+1 $ 行目には、操作で選んだ頂点を順に出力せよ。
Explanation/Hint
### 制約
- $ 2\ \leq\ N\ \leq\ 2000 $
- $ 0\ \leq\ p_i\ \leq\ i-1 $
- $ (a_0,\ a_1,\ ...,\ a_{N-1}) $ は $ (0,\ 1,\ ...,\ N-1) $ の順列である
### Sample Explanation 1
\- $ 1 $ 回目の操作後、頂点 $ 0,\ 1,\ ..,\ 4 $ に書かれた値は $ 4,\ 0,\ 1,\ 2,\ 3 $ となる
### Sample Explanation 2
\- $ 1 $ 回目の操作後、頂点 $ 0,\ 1,\ ..,\ 4 $ に書かれた値は $ 3,\ 1,\ 0,\ 2,\ 4 $ となる - $ 2 $ 回目の操作後、頂点 $ 0,\ 1,\ ..,\ 4 $ に書かれた値は $ 1,\ 0,\ 2,\ 3,\ 4 $ となる