概要
$1$ から $L$ の番号が振られた箱がある。最初、全ての箱は空である。
また数直線上にいる Alice は、以下のルールに従って数直線上を移動する。
- $[0, L]$ の区間のみを移動する。
- 始点と終点の座標は整数である。
- 座標が整数の点でのみ折り返す。
ある整数 $i$ によって $i - 0.5$ と表せる座標を通過する度に、 Alice は箱 $i$ に石を 1 個入れる。
その後 Bob は以下の操作を好きなだけ行い、箱 $i$ に石が $A_i$ 個入っているようにしたい。
- 1 つの箱から石を 1 つ取り除く。
- 1 つの箱に石を 1 つ入れる。
Bob が Alice の移動方法を自由に決められるとき、 Bob の最小の操作回数を求めよ。
制約
- $1 \leq L \leq 2 \times 10^5$
- $1 \leq A_i \leq 10^9$
考察
石の入れ方について色々模索した結果、以下の区間が左から順に並んでいることが必要十分条件と分かる。区間は空であってもいい。
- 何も置かない区間。
- 偶数個の石が 少なくとも 1 つ 置かれた区間。
- 奇数個の石が置かれた区間。
- 偶数個の石が 少なくとも 1 つ 置かれた区間。
- 何も置かない区間。
そこで、「今何番目の区間にいるか」を状態とする DP を考える。
$$ dp_{i, k} =\text{$\{A_1, \dots, A_i\}$ において、箱 $i$ が区間 $k$ に属するような石の置き方における最適解} $$
区間の個数を $K$ としたとき、この $dp$ は $O(KL)$ で埋まる。今回は $K=5$ なので、十分間に合う。
実装例
提出 #34682264 - 「みんなのプロコン 2019」
|
|