C - トーナメント Editorial by AngrySadEight


\(dp[i][j] = \)(第 \(i\) ラウンドで \(j\) が勝利している確率) という DP を考えます.このとき,初期値は全ての \(j\) に対して \(dp[0][j] = 1\),答えは \(dp[K][0]\) です.

遷移について考えます.第 \(i\) ラウンドで \(j\)\(k\) が対戦相手となる条件は,\(\lfloor \dfrac{j - 1}{2^i} \rfloor = \lfloor \dfrac{k - 1}{2^i} \rfloor\) かつ \(\lfloor \dfrac{j - 1}{2^{i-1}} \rfloor \neq \lfloor \dfrac{k - 1}{2^{i-1}} \rfloor\) が成り立つことです.したがってこのような \((j, k)\) の組に対して勝率を寄与させるように遷移を行えばよいです.

計算量は,全ての \((i, j, k)\) に対して,「第 \(i\) ラウンドに \(j, k\) が対戦相手となるか」を求めた場合 \(O(K4^K)\) となるほか,対戦相手となりうる \((j, k)\) に対してだけループを回すようにすることで \(O(K2^K + 4^K)\) も実現可能です(理由:第 \(i\) ラウンドの \(j\) の対戦相手となりうる人は \(2^{i-1}\) 人なので,対戦相手となりうる \((j, k)\) の総数は \(\sum_{i}^{K}2^{i-1}2^K = O(4^K)\)).

posted:
last update: