Fusing Slimes - 第6回 ドワンゴからの挑戦状 予選
#期待値
1. スライム i, i + 1 の間の距離が何回足されるか
方法 3 通り
1.1. 漸化式
1.2. 各々のスライムに対して何回通るかの確率を考える
1.3. 再帰的に解く
2. スライム i, j の間の距離が何回足されるか
editorial
https://img.atcoder.jp/dwacon6th-prelims/editorial.pdf
editorial の補足
1 indexed とする
i (1 ≤ i ≤ N - 1) に対し, i 番目のスライムと i + 1 番目のスライムの距離が何回足されるか考える
各単位部分が何回足されるか考えるのは本当によくある
シグマの入れ替え問題とか
4
1 2 3 5
距離は各々 1, 1, 2
スライム 1 , スライム 2 の間の 1 が何回足されるか
1
スライム 2 , スライム 3 の間の 1 が何回足されるか
(i) スライム 1 → スライム 2, スライム 2 → スライム 3
(ii) スライム 2 → スライム 3, スライム 1 → スライム 3
よって, 確率 で 1 が 1 回, 確率 で 1 が 2 回足される
スライム 2 , スライム 3 の間の距離が足される回数の期待値は, * 1 + * 2 =
スライム 3, スライム 4 の間の 2 が何回足されるか
問題文通りに実験
(i) 1 → 2, 2 → 3, 3 → 4
(ii) 1 → 2, 3 → 4, 2 → 4
(iii) 2 → 3, 1 → 3, 3 → 4
(iv) 2 → 3, 3 → 4, 1 → 4
(v) 3 → 4, 1 → 2, 2 → 4
(vi) 3 → 4, 2 → 4, 1 → 4
スライム 3, スライム 4 の間の距離が足される回数の期待値は, * 1 + * 2 + * 1 + * 2 + * 2 + * 3 =
実は, スライム i, スライム i + 1 の間の距離が足される回数の期待値は,
1 + + ... +
1, , をオンライン数列大辞典 (OEIS) に投げれば出てくる
先の例
4
1 2 3 5
の答えは
1 * 1 + 1 * + 2 *
1 + + ... + の求め方
(youtube の editorial より)
: 区間 i, i + 1 を通過するスライムの個数の期待値
スライム 1 ~ i が, 区間 i, i + 1 を通過する可能性を持つ
(i) スライム i が最初に移動する場合
スライム i は区間 i, i + 1 を通過し, 残りのスライムに対しては と同じ状況
(ii) スライム 1 ~ (i - 1) のいずれかが最初に移動する場合
それらが移動しても 2 ~ i のいずれかと合体するだけで, 区間 i, i + 1 を通過しない
そして, 残りのスライムに対しては と同じ状況
editorial (pdf) の補足
= 1 + + ... + の別の求め方
個々のスライムについて見る
が足される回数の期待値は, 各々のスライムがそこを通過する確率の和に等しい
スライム k (k ≥ i + 1) は確率 0
スライム i は確率 1
スライム i - 1 は, 先にスライム i がスライム i + 1 のとこに行ってたら, スライム i, i + 1 間を通る
よって, 確率
スライム i - 2 は, 先にスライム i, i - 1 がスライム i + 1 のとこに行ってたら, スライム i, i + 1 間を通る
よって, 確率 =
スライム i, i - 1 のどちらかを最初に選び, 次に, その選んでない方を選ぶ
スライム i - 3 に関しても同様に,
となる
別解
#期待値dp #挿入dp
Fusing Slimes [Dwango Programming Contest 6th B] - はまやんはまやんはまやん
補足
重要
はまやんさんの記事では数列が 132 なら, 2, 3, 1 の順に移動するが, 本記事では 1, 3, 2 の順に移動する
スライムが 8 体あるとする
スライム 7, 8 間の距離が何回足されるか
移動するスライムが 5, 7, 2, 6, 3, 4, 1 の順だとする
5 → 6 : 足されない
7 → 8 : 足される
2 → 3 : ×
6 → 8 : ⚪︎
3 → 4 : ×
4 → 8 : ⚪︎
1 → 8 : ⚪︎
計 4 回
まず, スライム 7 が移動するまで足されない
次, スライム 6が移動するまで足されない
...
スライム 7, 8 間の距離が何回足されるか
スライム 7, 6, 4, 1 が移動したとき
6 の次 4 なのは, すでに 5 は 4 に行ってるから
4 の次 1 なのは, 4 が移動する時点ですでに 2 → 3, 3 → 4 だから
1. スタートは, 移動するスライムの数列 5726341 の最大の数 7
2. 次に移動するのは, 7 の右の, 一番大きい数 6
...
以上は, スライムが 8 体ある場合の, 数列 5726341 の場合
1234567, 2356741 とか, 他のすべての数列も考える
再帰的に解けないか
dp[i] := i 個の順列を並び替えた全通りについての, スライム i, i + 1 間を通るスライムの個数の期待値
dp[i] = (dp[0] + 1) / i + (dp[1] + 1) / i + (dp[2] + 1) / i + (dp[3] + 1) / i + ... + (dp[i - 1] + 1) / i
/ i の理由
挿入箇所は等確率で選ばれる
+ 1 の理由
書き出してみる
dp[0] = 0
数列がない
dp[1] = (dp[0] + 1) / 1 = 1
数列がないとこには, 1 を置くだけ
(挿入箇所は 1 箇所)
確率 1 で 1 箇所に挿入
dp[2] = (dp[0] + 1) / 2 + (dp[1] + 1) / 2 =
別解 2
第6回 ドワンゴからの挑戦状 予選 : B - Fusing Slimes - kmjp's blog
補足
スライム i が, ちょうどスライム j まで移動する確率
スライム i, j 間の距離に注目してることになる
(i) スライム j が最も右, すなわち j = N のとき
スライム i より右のスライムすべてが, スライム i より先にスライム j のとこへ行く
そうすれば, スライム i はスライム j - 1, j 間を移動できる
確率は,
まず, スライム i ~ (j - 1) のうち, スライム i 以外から選ぶ
次に, スライム i 以外の残りから選ぶ
...
j = N より,
(ii) j N のとき, すなわち, スライム j がいつか移動するとき
i ~ j のうち, j が最後に移動する
そうでないと, j のとこでとまれない
i ~ (j - 1) で, i が最後に移動する
もう一度
i ~ j で, i, j 以外をすべて選ぶ
次に, i を選ぶ
最後に, j を選ぶ
最初の方をもう少し延ばしてみる
だけ残りそう #ques
後ろの方をもう少し延ばしてみる
(X[j] - X[i])
の中身
X[j] - X[i]
各々, 累積和で計算する
本番で何をやってたか
区間 i, j を決めたとする
(i, k), (k, j) に分けて部分問題にできないか
とりあえず, 計算量は置いといて
重複なく, 漏れなくできるか?
できない
sample 1
3
1 2 3 5
で,
(以下, 数字はスライムの番号)
(1, 2), (2, 4) から
1 → 2, 2 → 3, 3 → 4 が作れるし,
(1, 3), (3, 4) からも
1 → 2, 2 → 3, 3 → 4 が作れる
区間 i, j が足される回数や, 区間 i, i + 1 が足される回数を考えようとするも, わからなかった
1 → 3, 2 → 3 とかはない
ありうるものをまとめられなかった
i の左や j の右はどうすんのってなった
区間 i, i + 1 に関して考える場合, スライム i, i-1, i-2, ... の順に見ればよかった