回答編集履歴

1

コメントを受けての追記

2023/06/07 02:13

投稿

fana
fana

スコア11663

test CHANGED
@@ -52,3 +52,49 @@
52
52
  return 0;
53
53
  }
54
54
  ```
55
+
56
+ ---
57
+
58
+ > 親が何代目かがわかればそれに1足せば答えになると思うのですが、分裂番号が何代目かかを記録していくのではなく、A_iを分裂番号目の配列に記録していくことでなぜ答えにつながるのかがわかりません。
59
+
60
+ というコメントを受けての追記:
61
+
62
+ 【あなたが言うようなアルゴリズムでも問題を解くことができますが,それは提示されたコードが使っているアルゴリズムとは異なる】というだけのことです.
63
+
64
+ 分裂番号が何代目かを記録していく形の方法を実装するとしたら,例えば以下のようになるでしょうか.
65
+
66
+ ```C++
67
+ int main()
68
+ {
69
+ //問題文と記号を合わせて { N, Ai } みたいな変数名を用いたら分かりやすいであろう.
70
+ int N, Ai;
71
+ std::cin >> N;
72
+
73
+ //呪文みたいな数式を書くんじゃなくて,意味がある値をその意味を示す名称の変数に保持してみるとか
74
+ const int nAmeba = 1 + 2*N; //アメーバの総数(まず最初の1匹がいて,記録1つにつき2匹増える)
75
+
76
+ //i番目の記録での分裂によって発生したアメーバとは何世代目の存在なのか?を記録する用.
77
+ //※便宜上,最初の一匹目が「i=0 番目の分裂で発生した」と見なす.
78
+ std::vector<int> ANS_i( N+1, 0 ); //最初の一匹目用のデータとして,ANS_i[0] = 0 としておく
79
+
80
+ //各アメーバが何番目の分裂によって発生したのか?を記録する用.
81
+ // アメーバの番号は 1-based な値なので,[0]は未使用.
82
+ std::vector<int> iOfAmeba( nAmeba + 1, 0 ); //最初の一匹目用のデータとして,iOfAmeba[1] = 0 としておく
83
+
84
+ //N個の分裂記録を読込みつつ,内容を記録していく.
85
+ for( int i=1; i<=N; ++i ) //ここの変数名 i は問題文での記号に合わせてのこと
86
+ {
87
+ std::cin >> Ai;
88
+ ANS_i[ i ] = iOfAmeba[Ai] + 1;
89
+ iOfAmeba[ i*2 ] = i;
90
+ iOfAmeba[ i*2 + 1 ] = i;
91
+ }
92
+
93
+ //結果出力
94
+ for( int AmebaNo=1; AmebaNo<=nAmeba; ++AmebaNo )
95
+ {
96
+ std::cout << ANS_i[ iOfAmeba[AmebaNo] ] << '\n';
97
+ }
98
+ return 0;
99
+ }
100
+ ```