2019年8月22日木曜日

AGC 033 D - Complexity

AGC 033 D - Complexity

f(y1,x1,y2,x2):=f(y_1, x_1, y_2, x_2) := 矩形[y1,y2)×[x1,x2)[y_1, y_2) \times [x_1, x_2)の複雑度

とすれば自明な漸化式が導けるが、時間的にも空間的にも間に合っていない。そこで、次の点に注目する:

  • 複雑度は高々log2(HW)=16\lceil \log_2(HW) \rceil = 16と小さい
  • x2x_2y2y_2が増加すると複雑度は単調に増加する

したがって、ナップサックDPのように値と変数を入れ替えたDPができる。具体的には

f(y1,x1,y2,c):=f(y_1, x_1, y_2, c) := [y1,y2)×[x1,X)[y_1, y_2) \times [x_1, X)の複雑度がcc以下になるような最大のXX
g(y1,x1,x2,c):=g(y_1, x_1, x_2, c) := [y1,Y)×[x1,x2)[y_1, Y) \times [x_1, x_2)の複雑度がcc以下になるような最大のYY

としてDPする。f(y1,x1,y2,c)f(y_1, x_1, y_2, c)の漸化式を与える。左右に分割する場合に限ったXXの最大値は、複雑度c1c-1以下の2つの横に並んだ矩形についてできるだけ横幅の合計を大きくすることで達成できるので

f(y1,f(y1,x1,y2,c1),y2,c1)f(y_1, f(y_1, x_1, y_2, c-1), y_2, c-1)

また、上下に分割する場合のXXの最大値は、複雑度c1c-1以下の2つの縦に並んだ矩形を、高さの合計がy2y_2以上になるようにするという条件でできるだけ横幅を大きくすることで達成できるので

arg maxX(g(g(y1,x1,X,c1),x1,X,c1)y2)\argmax_X \bigl( g(g(y_1, x_1, X, c-1), x_1, X, c-1) \ge y_2\bigr)

となり、この2つのうちの大きいほうがf(y1,x1,y2,c)f(y_1, x_1, y_2, c)である。(後者は二分探索で得られる。) 同様に、g(y1,x1,x2,c)g(y_1, x_1, x_2, c)

g(g(y1,x1,x2,c1),x1,x2,c1))g(g(y_1, x_1, x_2, c-1), x_1, x_2, c-1))

arg maxY(f(y1,f(y1,x1,Y,c1),Y,c1)x2)\argmax_Y \bigl( f(y_1, f(y_1, x_1, Y, c-1), Y, c-1) \ge x_2 \bigr)

の大きいほうに等しい。

α:=max(H,W)\alpha := \max (H, W)とするとき、計算量はO(α3log2α){\mathcal O}(\alpha^3 \log^2 \alpha)。かなり厳しそうだが、TLが5秒なのでメモ化で一応通った。想定はボトムアップのDPで尺取り法っぽくやってO(α3logα){\mathcal O}(\alpha^3 \log \alpha)らしい。

参考:
http://drken1215.hatenablog.com/entry/2019/05/10/215400