Official

C - LU / RD Marking Editorial by maspy


ヒント → https://atcoder.jp/contests/arc166/editorial/7181


[1] 問題の分割

グリッドの辺全体を,「同時に操作対象となりうる 2 辺」が同一の成分に含まれるように,次の図のようにいくつかの成分に分割します:

各成分に対しては,どのような辺集合に印がつけられるかが独立に定まるため,本問の答は成分ごとの答の積として計算できます.


[2] 成分ごとの問題の解法

成分ごとには次の問題を解けばよいです.

\(n\) 個の辺が一列に並んでいる.まだ印のついていない連続する \(2\) つの辺に印をつけるという操作が行える.最終的に印のついている辺集合としてありうるものの個数を求めよ.

この問題の答を \(a_n\) とします.\(n\geq 2\) とするとき,

  • 左端の辺に印をつけない場合:\(a_{n-1}\) 通り
  • 左端の辺に印をつける場合:\(a_{n-2}\) 通り

と場合分けして数えることにより,漸化式 \(a_n = a_{n-1}+a_{n-2}\) が得られ,この漸化式によって \(\{a_n\}\) はひとつあたり \(O(1)\) 時間で計算できます(Fibonacci 数列という有名数列になります).


[3] 本問題の解法

適切に計算式を整理すれば,本文の答えは

\[(a_2a_4\cdots a_{2n})^2a_{2n+1}^m\]

のような形で表すことができます.[2] の漸化式を踏まえると,テストケースごとに \(\Theta(H+W)\) 時間などで答を計算できることが分かりますが,これでは本問の制約では TLE になると考えられます.

しかしこの部分の計算量改善は簡単です.各 \(n\) に対する \(a_2a_4\cdots a_{2n}\)\(a_{2n+1}\) などの値を個別のテストケースとは独立に事前計算しておけばよいです.

前計算に \(\Theta(\max(H_i, W_i))\) 時間,テストケースごとに \(\Theta(\log(|H-W|))\) 時間などの計算量で解くことができ,これは十分高速です.

posted:
last update: