2021年7月26日月曜日

KUPC 2016 H - 壁壁壁壁壁壁壁

KUPC 2016 H - 壁壁壁壁壁壁壁

位置iiからi+1i+1に補強材を移動する量をxix_iとして制約を書き下す。n=4n=4なら

  • A1x1B1A_1-x_1 \ge B_1
  • A2+x1x2B2A_2 + x_1-x_2 \ge B_2
  • A3+x2x3B3A_3 + x_2-x_3 \ge B_3
  • A4+x3B4A_4+x_3 \ge B_4

という制約の下でx1+x2+x3+x4|x_1|+|x_2|+|x_3|+|x_4|を最小化する問題になっている。

fi(x)f_i(x)x1,...,xi1,xi=xx_1, ..., x_{i-1}, x_i=xまでを決定した際の最小コストとする。slope trick向けに制約を変形すると、

  • x1A1B1x_1 \le A_1-B_1
  • x1x2(A2B2)x_1 \ge x_2-(A_2-B_2)
  • x2x3(A3B3)x_2 \ge x_3-(A_3-B_3)
  • x3B4A4x_3 \ge B_4-A_4

となって、一番上のx1x_1に関する制約を無視するとfif_iの漸化式が得られる:

  • f1(x)=xf_1(x) = |x|
  • f2(x)=mintx(A2B2)f1(t)+xf_2(x) = \min_{t \ge x - (A_2-B_2)}f_1(t) + |x|
  • f3(x)=mintx(A3B3)f2(t)+xf_3(x) = \min_{t \ge x - (A_3-B_3)}f_2(t) + |x|

登場する操作はすべてslope trickで表現できて、答えは凸性により、B4A4B_4-A_4arg minxf3(x)\argmin_xf_3(x)の大きいほうの位置でf3f_3の値を求めると得られる。

制約x1A1B1x_1 \le A_1-B_1については、この範囲を超えると高いコストがかかることにして対処したい。x1x_1A1B1A_1-B_111超過することによる利益が高々CCであるとき、f1(x)=x+Cmax(0,x(A1B1))f_1(x) = |x| + C\max(0, x-(A_1-B_1))とすればよい。CCの具体的な値としては、制約を11だけ破っている状態を解消するために1つの補強材を端から端へ移動するとN1N-1のコストがかかるので、N1N-1でよい。