题目描述
N 頂点の根つき木が与えられます。 頂点には番号 0, 1, ..., N−1 がついており、根は頂点 0 です。 そして、頂点 i(i = 1, 2, ..., N−1) の親は頂点 pi です。
はじめ、頂点 i には整数 ai が書かれています。 なお、(a0, a1, ..., aN−1) は (0, 1, ..., N−1) の順列になっています。
あなたは以下の操作を 25,000 回まで好きな回数実行できます。頂点 i に書かれた値が i となるようにしてください。
- 頂点を 1 個選び v とする。頂点 0 と頂点 v の間のパスを考える。
- パス上の頂点の値を回転させる。つまり、パス上の各辺 (i, pi) について、頂点 pi に書かれた値を頂点 i に(この操作の直前に)書かれていた値に書き換え、頂点 v の値は頂点 0 に(この操作の直前に)書かれていた値に書き換える。
- なお、頂点 0 を選んでもよいが、この場合はなにもしないという操作になる。
输入格式
入力は以下の形式で標準入力から与えられる。
N p1 p2 ... pN−1 a0 a1 ... aN−1
输出格式
1 行目に操作の回数 Q を出力せよ。 2 行目から Q+1 行目には、操作で選んだ頂点を順に出力せよ。
题目大意
题目描述
给予N个结点的树。结点编号为0, 1,\…, N−1,根结点编号为0。然后,顶点i(i =1, 2,\…, N−1)的父结点是点pi。
开始,结点i等于整数ai。另外,(a0, a1,\…, aN−1)为(0, 1,\…, N−1)的序列。
你可以按自己喜欢的次数执行以下操作,最高可达25,000。 请把顶点i的值变成i。
-顶点为1个选择v。考虑顶点0和顶点v之间的路径。
-旋转路径上顶点的值。也就是说,对于路径上的每边(i, pi),将顶点pi所写的值改写为顶点i(就在操作之前),顶点v的值为顶点0改写成(在这个操作之前)写的值。
-另外,也可以选择顶点0,不过,这相当于什么都没做。
输入格式
输入以以下形式输入:
N p1 p2…pN−1 a0 a1…aN−1
输出格式
在第1行输出操作的次数Q。从第2行到第Q+1行,按顺序输出通过操作选出的顶点。
输入输出样例
输入#1
5
0 1 2 3
2 4 0 1 3
输出#1
2
3
4
输入#2
5
0 1 2 2
4 3 1 2 0
输出#2
3
4
3
1
提示
数据范围
(a0, a1,\…, aN−1)为(0, 1,\…的序列。
Sample Explanation 1
- 1第一次操作后,顶点0, 1, .. 4所写的值为4 0 1 2 3
Sample Explanation 2
- 1第一次操作后,顶点0, 1, ..写, 4值是3, 1,, 2, 4 - 2次操作后,顶点 1, .. 4所写的值为1 0 2 3 4
5
0 1 2 3
2 4 0 1 3
2
3
4
5
0 1 2 2
4 3 1 2 0
3
4
3
1
提示
制約
- 2 ≤ N ≤ 2000
- 0 ≤ pi ≤ i−1
- (a0, a1, ..., aN−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 となる