geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

ABC244 参加記録

コンテスト中AC:A〜E

C - Yamanote Line Game

インタラクティブな問題を初めて解いたのでメモ
提出コード

D - Swap Hats

自信ないまま通してしまいました。

操作を偶数回行った後に生成される状態には10^{18}回行った後もその状態にできます。

10回操作すると状態数は2^{10}になるものの、RGBの順番の入れ替えの通り数は6通りしかありません。
そのため、Sを10回操作してTにできれば達成できると考えました。

実際に実装してデバッグしてみると、状態数は偶数回、奇数回共に早々に3個に限定され、解を得られそうだとわかりました。
そして、提出した結果ACできました。

公式解説によれば、6種類の状態の関係性をグラフにすると、二部グラフになり、S,Tが同一のグループになれば達成できるということでした。

提出コード

E - King Bombee

パスに関する以下のDPを考えます。

dp[u][k]:=k回移動した後に頂点uにいるようなパスの総数
初期値はdp[S][0] = 1

これは、A=\{A_0,A_1,\cdots ,A_k\}のうち、A_k =uであるものの総数に一致します。

このDPテーブルの更新は、以下のような3重ループになります。

for k = 1からKまで
    for u in 全ての頂点
        for v in uと接続する全ての頂点
            dp[v][k] = dp[u][k-1] //uからvに移動する

for v in uと接続する全ての頂点の部分は、kのループの1回につき、合計で2M回しか実行されないので、O((N+M)K)になります。
また、K回目でTにいるパスの総数はdp[T][K]となります。

ここまでは、同様の考え方が過去に出題されました。

あとはXに訪れた回数(Aに含まれるXの個数)の偶奇の情報が欲しいので、DPテーブルに加えます。

dp[u][k][x]:=k回移動した後に頂点uにいて、かつXに訪れた回数の偶奇がxであるようなパスの総数
但し、x=\{0,1\}であり、x=0の時はXに訪れた回数が偶数、x=1の時は奇数

DPテーブルの更新は、以下のようにv=Xの時だけ、偶奇を入れ替えればよいです。

for k = 1からKまで
    for u in 全ての頂点
        for v in uと接続する全ての頂点
            if vがX
                dp[v][k][0] = dp[u][k-1][1]
                dp[v][k][1] = dp[u][k-1][0]
            else
                dp[v][k][0] = dp[u][k-1][0]
                dp[v][k][1] = dp[u][k-1][1]

答えはdp[K][T][0]です。
提出コード