H - Guess the Sum Editorial
by
Mitsubachi
O(polyN) 解法
足し引きして $[l, r]$ を作れるような(できるだけ少ない)区間の集合を作る問題とみなして、これを再帰的に解くことを考えます。
まず $l = r$ のときは $\{ [l,r] \}$ で良いです。 $l + 1 = r$ のときは $l$ が偶数なら $\{ [l,r] \}$ で良く、そうでないなら $\{ [l, l], [r, r] \}$ です。 $l + 1 < r$ とします。
\([1]\) \(l\) が偶数、 \(r\) が奇数の時
\(\left( l, r \right) := \left( \frac{l}{2}, \frac{r - 1}{2} \right)\) とした時の答えの各区間の値を \(2\) 倍すれば良いです。
\([2]\) \(l\) が偶数、 \(r\) が偶数の時
\([ l, r]\) を \([l, r - 1] + [r, r]\) とみなすと \(\left( l, r \right) := \left( \frac{l}{2}, \frac{r}{2} - 1 \right)\) とした時の答えの各区間の値を \(2\) 倍したものに \([ r, r]\) を追加したものとなります。
\([l, r + 1] - [r + 1, r + 1]\) とみなすと \(\left( l, r \right) := \left( \frac{l}{2}, \frac{r}{2} \right)\) とした時の答えの各区間の値を \(2\) 倍したものに \([ r+ 1, r+1]\) を追加したものとなります。
この \(2\) つのうち要素数が少ない方を採用すれば良いです。
\([3]\) \(l\) が奇数、 \(r\) が奇数の時
\([2]\) と同様に \(2\) 通りの場合分けをすれば良いです。
\([3]\) \(l\) が奇数、 \(r\) が偶数の時
\([2], [3]\) と同様に \(4\) 通りの場合分けをすれば良いです。
メモ化再帰をすれば \(O \left( N^3 \right)\) などで解けます。
posted:
last update: