ARC109-E 1D Reversi Builder の解法が少し既存の解説と違ったので紹介します
備忘録的な感じ
参考リンク
問題概要・考察の初歩は上記のリンクをご覧ください
盤面を固定した結果はけんちょんさんのブログの「正攻法」欄に記載されています
以下の説明は、この「正攻法」の考察がなされていることを前提とします
まず、多項式時間で「正攻法」の数え上げができるか考えてみます
以下の考察は左端が黒・右端が白であることを仮定します
スタートの位置を固定します
ゲーム終了時の黒い石の個数は、左から何個黒が続くか、右から何個白が続くかの2つの情報でわかります
これらをそれぞれ , とします(けんちょんさんの記事と同様)
よって、, , の3つを定めればゲーム終了時の黒い石の個数がわかるので、 で数え上げることができます
ただし、今回の問題ではなので、程度まで高速化する必要があります
ここでを~まで動かしながら計算していくことを考えます
まず、 = のときは ゲーム終了時の黒い石の個数はになります
を決め打って、そのときの値を計算しておきましょう
一番左が黒、右から個が白 = 右から個目は黒になるので、自由に決められる色は(, )個あり、この値をとすると、() × を足し合わせればよいです
それでは、を1つずつ進めていきましょう
を1つずつ進めていくと、では終了時に個黒い石があったのに、では終了時に個しか黒い石がない盤面が出てきます
その一方で、左端を黒に固定しているので、よりもで終了時の黒い石が多くなることはありません
そこで、では終了時に個黒い石があったのに、では終了時に個しか黒い石がない盤面をまとめて数えることを考えます
そのような変化が起こるのは以下の2パターンになります
・
・
ほとんど考え方は同じなので、 の場合のみ説明します
とおきます (こちらの場合は条件よりは存在できないことに注意)
この条件を満たす盤面の個数を考えます
左から個は黒、左から番目は白、右から個は白、右から番目は黒になることから、自由に決められるのは個になります
※からの距離が以上の場所はすでにきまっていると考えるのがわかりやすいかもしれません
よって、を固定した時、からになるタイミングで、() × だけ終了時の黒い石の個数が減少します
あるについて、とることのできるの範囲は単一の区間になるので、あらかじめ各のときの値を計算し、累積和を求めておくことでからに変わるときの差分を()で計算できるので、全体を()で求めることができます
実装例