#36. 星际跳跃计划

    ID: 36 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 7 上传者: 标签>动态规划数据结构单调队列斜率优化

星际跳跃计划

题目描述

银河系中分布着 nn 个空间站,编号从 11 到 nn。第 ii 个空间站的坐标为 xix_i(保证 x1<x2<⋯<xnx_1 < x_2 < \dots < x_n)。

宇航员需要驾驶飞船从空间站 11 出发,最终到达空间站 nn。为了节省燃料并控制风险,宇航员制定了如下跳跃规则:

  1. 每次跳跃只能从编号较小的空间站跳到编号较大的空间站(即若当前在 ii,下一步必须去 j>ij > i)。
  2. 设上次停留的空间站为 pp,当前准备跳往的空间站为 qq。这次跳跃产生的“风险值”定义为 (xq−xp)2+C⋅(xq−xp)(x_q - x_p)^2 + C \cdot (x_q - x_p),其中 CC 是一个给定的常数。
  3. 总风险值是路径上所有跳跃风险值之和。

你的任务是计算从空间站 11 到空间站 nn 的最小总风险值。

输入格式

第一行包含两个整数 nn 和 CC,表示空间站的总数和风险参数。 接下来一行包含 nn 个整数 x1,x2,…,xnx_1, x_2, \dots, x_n,表示各空间站的坐标。

输出格式

输出一行一个整数,表示最小总风险值。

样例

3 0
0 2 5
13

样例解释

f[1]=0f[1]=0

f[2]=(2−0)2+0=4f[2] = (2-0)^2 + 0 = 4

$f[3] = \min(f[1]+(5-0)^2, f[2]+(5-2)^2) = \min(25, 4+9=13) = 13$.

数据范围与提示

对于 100% 的数据,满足:

  • 2≤n≤5×1052 \le n \le 5 \times 10^5
  • 0≤C≤1090 \le C \le 10^9
  • 0≤x1<x2<⋯<xn≤1090 \le x_1 < x_2 < \dots < x_n \le 10^9
  • 答案保证在 64 位有符号整数范围内。

提示: 本题的 DP 转移方程为:

$$f[i] = \min_{1 \le j < i} \left( f[j] + (x_i - x_j)^2 + C(x_i - x_j) \right)$$

展开平方项:

$$f[i] = \min_{j < i} \left( f[j] + x_i^2 - 2x_i x_j + x_j^2 + C x_i - C x_j \right)$$

整理得:

$$f[i] = x_i^2 + C x_i + \min_{j < i} \left( (f[j] + x_j^2 - C x_j) - 2x_i x_j \right)$$

令 Aj=f[j]+xj2−CxjA_j = f[j] + x_j^2 - C x_j,Bj=−2xjB_j = -2 x_j。 则我们需要求 min⁡j<i(Aj+Bjxi)\min_{j < i} (A_j + B_j x_i)。 这是一个典型的“半平面交”或“动态凸包”问题。由于 xix_i 单调递增,且 BjB_j(即斜率)随 jj 增大而减小(因为 xjx_j 增大,−2xj-2x_j 减小),我们可以使用单调队列维护下凸壳,从而将复杂度优化至 O(n)O(n)。

注意:由于 CC 和 xix_i 可能很大,中间计算过程必须使用 long long。