Official
B - Almost Large Editorial
by
B - Almost Large Editorial
by
tassei903
\(N\) 頂点のグラフを考えて、\(S_i\) から \(S_j\) に変換できるとき、\(i \rightarrow j\) の辺を張り、 \(1\) から \(N\) に到達できるかという問題を解けば良いです。しかし、考えるべき辺の本数が \(O(N^2)\) あるので、辺の数を減らしたいです。
一回の操作を以下の一連の操作に言い換えます。
- ある桁を選びその桁の数字を \(0\) にする。
- その後、好きな桁の数字を(その桁の数字が \(2\) 未満のとき) \(1\) 増やすことを繰り返す。
- \(S_i\) のいずれかと一致するなら操作を終了する。
上記の操作で考えると、以下のグラフを考えることができます。 \(M = 12\) を桁数とします。
- \(3^M\) 個の頂点 \(a_0, a_1, \cdots, a_{3^M-1}\) と \(N\) 個の頂点 \(b_1, \cdots, b_N\) を用意する。
- \(i=1,2,\dots, N\) について \(a_{S_i} \to b_i\) に辺を張る。
- \(S_i\) の \(3\) 進数表記を \(n_1n_2\cdots n_M\) として、 \(j=1,2,\cdots,M\) について \(x = n_1n_2\cdots n_{j-1} 0 n_{j+1} \cdots n_M\) として \(b_i \to a_x\) に辺を張る。
- \(i=0,1,\cdots, 3^M-1\) について、 \(i\) の \(3\) 進数表記が \(n_1n_2\cdots n_M\) として、 \(j=1,2,\cdots, M\) について \(n_j \lt 2\) なら \(x = n_1n_2\cdots n_{j-1} (n_{j}+1) n_{j+1} \cdots n_M\) として \(a_i \to a_x\) に辺を張る。
このグラフで、 \(b_1\) から \(b_N\) に到達可能かを判定すれば良いです。
DFSをすることで、 \(O(M(3^M + N))\) で判定することができます。
posted:
last update:
