筑波大学プログラミングコンテスト2023
コンテスト日時
2023/09/03 (Su) 14:00 - 17:00

F - The Edge of Edges

Benihuki
2
s
1024
MB
500

問題文

$N$ 頂点からなる木が与えられます。頂点 $i$ は、頂点 $A_i$ に接続しています。

$f(x)$ を、「頂点 $x$ から深さ優先探索を始めたときに、最後に訪れることになる頂点」と定義します。

すべての $i\ (1 \leq i \leq N)$ について $f(i)$ を求めてください。

$f(x)$ の厳密な定義

数列 $E \coloneqq (x), S = ()$ とする。以下を繰り返す。

[$E = (y, \dots )$ の場合]

  • $E$ から $y$ を取り除く。
  • $y$ に接続する頂点のうち、$S$ に含まれない頂点を $C=c_1, c_2, \dots, c_n$ とする。
  • $C$ を 昇順に 並び替えて、$E$ の先頭に追加する。
  • $S$ の末尾に $y$ を追加する。

[$E = ()$ の場合]

  • $f(x) = S_m\ (m=|S|)$ である。繰り返し終了。(制約により $S$ が空でないことは保証される。)

制約

この問題では、すべてのテストケースについて、以下の制約を満たす。

  • $2 \leq N \leq 2 \times 10^5$
  • $1 \leq A_i \leq N\ (2 \leq i \leq N)$
  • $A_i \neq i\ (2 \leq i \leq N)$
  • 与えられるグラフは木である。

部分点

この問題には、部分点が設定されている。
$N \leq 300$ のテストケースにすべて正解すると、$100$ 点が与えられる。
$N \leq 2000$ のテストケースにすべて正解すると、追加で $100$ 点が与えられる。

入力

入力は、以下の形式で標準入力から与えられる。

$N$
$A_2$ $A_3$ $\cdots$ $A_N$

出力

問題文で指定された方法で計算した $f(x)$ について、

$f(1)$ $f(2)$ $\cdots$ $f(N)$

の形で出力せよ。

入力例 1
6 1 2 3 2 3
出力例 1
5 5 6 6 6 4

頂点 $4$ から始めると、$S$ の要素は最終的に $(4, 3, 2, 1, 5, 6)$ となります。よって、$f(4)=6$ です。

提出
C++23 (g++ 12.2.0)