Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Beginner Contest 334 F問題 Christmas Present 2

問題

atcoder.jp

提出解答

atcoder.jp

解法

座標平面上の点  S, P_i~(i=1,2, \dots, N) S = (S_X, S_Y), P_i = (X_i, Y_i) とする.

動的計画法で解く.  i = 1, 2, \dots, N+1 に対して,  {\rm DP}(i) で, 問題を  P_i, P_{i+1}, \dots, P_N へ制限したときの距離の総和の最小値とする. このとき, 最終解答は  {\rm DP}(1) になる.

ベースケースは  i = N + 1 のときで, このとき, 経由すべき点がないことから, 移動が発生しないので,  {\rm DP}(N + 1) = 0 である.

遷移式を考える.  i のときに, 連続して配るプレゼントの個数  k で場合分けをする. 連続して  k 個配る場合における距離の総和を最小化する移動の方法は, 以下の手順をたどることになる.

  •  S から 点  P_i へ移動.
  •  j = 1,2, \dots, k - 1 に対して, 点  P_{i+j-1} から  P_{i+j} へ移動.
  •  P_{i + k - 1} から点  S へ移動.
  • それ以降は  {\rm DP}(i + k) を達成するように移動する.

よって, この場合における距離の総和の最小値は

 \displaystyle \operatorname{dist}(S, P_i) + \sum_{j = 1}^{k - 1} \operatorname{dist}(P_{i + j - 1}, P_{i + j}) + \operatorname{dist}(P_{i + k - 1}, S) + {\rm DP}(i + K)

となる.

これを  k について動かすことによって,  {\rm DP}(i) の値は

 \displaystyle \begin{align*} {\rm DP}(i)
&= \displaystyle \min_{\substack{1 \leq k \leq K \\ i + k \leq N + 1}} \left( \operatorname{dist}(S, P_i) + \sum_{j = 1}^{k - 1} \operatorname{dist}(P_{i + j - 1}, P_{i + j}) + \operatorname{dist}(P_{i + k - 1}, S) + {\rm DP}(i + k) \right) \\
&= \displaystyle  \operatorname{dist}(S, P_i) + \min_{\substack{1 \leq k \leq K \\ i + k \leq N + 1}} \left(\sum_{j = 1}^{k - 1} \operatorname{dist}(P_{i + j - 1}, P_{i + j}) + \operatorname{dist}(P_{i + k - 1}, S) + {\rm DP}(i + k) \right) 
\end{align*}\

となる.

ここで,  T(i + k) := \operatorname{dist}(P_{i + k - 1}, S) + {\rm DP}(i + k) とおくことにすると,

 \displaystyle {\rm DP}(i) = \operatorname{dist}(S, P_i) + \min_{\substack{1 \leq k \leq K \\ i + k \leq N + 1}} \left(\sum_{j = 1}^{k - 1} \operatorname{dist}(P_{i + j - 1}, P_{i + j})+ T(i + k) \right)

となる.

また,  1 \leq l \leq r \leq N に対して,

 \displaystyle U_{l,r} := \sum_{t = l + 1}^r \operatorname{dist}(P_{t - 1}, P_t)

とおくことにすると,

 \displaystyle {\rm DP}(i) = \operatorname{dist}(S, P_i) + \min_{\substack{1 \leq k \leq K \\ i + k \leq N + 1}} \left( U_{i, i + k} + T(i + k) \right)

となる.

ここで,  U_{i, i + k} + T(i + k)~(1 \leq k \leq K) について,

 U_{i, i + k} + T(i + k) =  \operatorname{dist}(P_i, P_{i + 1}) + U(i +1, i + k) + T(i + k)

が成り立つ.

 \operatorname{dist}(P_i, P_{i + 1}) k によらない一定の値である.

したがって, 次のことが高速にできるデータ構造があれば高速に  {\rm DP}(i) を計算できる.

  • 区間における最小値を取得する.
  • ある区間に一定値を加算する.

これを可能にするデータ構造としては遅延評価セグメント木がある.

よって,  U(i, i + k) + T(i + k) を遅延評価セグメント木によって適切に区間作用を行い  {\rm DP}(i) を計算することによって,  {\rm DP}(1) O(N \log N) 時間で求めることができる.