AtCoder Beginner Contest 298 メモ
コンテストページ: TOYOTA MOTOR CORPORATION Programming Contest 2023#1 (AtCoder Beginner Contest 298) - AtCoder
コンテスト中AC: A〜F
E - Unfair Sugoroku
期待値や確率の問題はメモ化再帰で解ける場合が多いです。
状態遷移を考えた時、
遷移する確率×遷移先で得られた確率
の総和により答えを計算できます。具体的には、
高橋くんがマス
、青木くんがマス
で、手番の状態が
の時に高橋くんが勝つ確率
但し、であり、
のときは高橋くんの手番、
のときは青木くんの手番とします。
からは以下のように遷移します。
の時
の時
今回遷移する確率は等確率なので、
の時
の時
です。
再帰の終了条件は、なら高橋くんの勝ちなので
、
なら青木くんの勝ちなので
です。
後は、メモ化再帰して、を解けばよいです。
計算量は、ワーストケースで状態数がで、各状態につき遷移に
かかるので、
であり問題ありません。
F - Rook Score
行のスコアの最大値+列のスコアの最大値を答えとできれば単純ですが、このようにはいきません。なぜなら、行と列
を選んだ時、マス
の整数が2回足されるため、この整数を引かなければいけないためです。
計算量的に選ぶ行を全探索することは可能です。後は、行を固定したときの列のスコアの最大値が高速にわかれば解くことができます。
やや大雑把ですが、例とともに解法を説明します。
行を選んだとします。
列の整数の和が
であるような数列を
とします。また、
行には列
に整数
が書かれていたとします。
今求めたいのは、元のから同じ行の整数を引いた
です。
列の座標圧縮をします。仮に、
と変換されたとします。求めたいものは、
となります。
座標圧縮後のは
以下なので、配列として保持できるサイズとなります。そのため、Segment Treeにより、区間最大のクエリに答えることで最大値を得ることが可能です。
後は、同じ行に存在する整数を引く部分ですが、これは各行毎に以下のように処理します。
- 同じ行の整数を
から引く
- 最大値を得る
- 同じ行の整数を
に足し、元に戻す
各整数につき、引く・足すが1回ずつしか行われないので、Segment Treeの値更新を考えてもで処理できます。