Official

G - Impassable Game Editorial by hint908


先⼿の駒が頂点 \(i\) 、後⼿の駒が頂点 \(j\) にある状態を \((i,j)\) とします。 \((i,j)\) の状態から⾃分の勝ちである状態に移動できるなら \((i,j)\) は⾃分の勝ち、そうでないなら負けです。

動的計画法により後ろから解きます。
\(dp_{i,j} := (i,j)\) について \(0\) なら先⼿勝利、\(1\) なら後⼿勝利 とします。
最初、深さ \(K\) の頂点 \(x\) に対して \(dp_{x,x} = 1\) と初期化します。

頂点 \(i\) の深さが \(k\)、頂点 \(j\) の深さが \(k-1\) のとき、次に動かすのは後手です。
深さ \(k\) の頂点 \(y\) について、\(j \rightarrow y\) の辺を後手が使用でき、かつ \(dp_{i,y} = 1\) であるものが存在すれば \(dp_{i,j}=1\)、そうでなければ \(dp_{i,j}=0\) です。

頂点 \(i\) の深さが \(k\)、頂点 \(j\) の深さが \(k\) のとき、次に動かすのは先手です。
深さ \(k+1\) の頂点 \(x\) について、\(i \rightarrow x\) の辺を先手が使用でき、かつ \(dp_{x,j} = 0\) であるものが存在すれば \(dp_{i,j}=0\)、そうでなければ \(dp_{i,j}=1\) です。

愚直に遷移させていくことで \(O(N^3)\) 時間または \(O(NM)\) 時間で解くことができます。

これらの遷移は bitset の \(or, and\) 演算を用いることができます。
必要箇所を適宜転置、01 で埋めることで \(\displaystyle O\left(\frac{NM}{w}+N^2\right)\) 時間で解くことができました。

posted:
last update: