Official

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: