「CF704B」Ant Man

Description

Link:CF704B

有 nn 个元素,第 ii 个元素有五个参数 xi,ai,bi,ci,dix_i, a_i, b_i, c_i, d_i。

你需要求出一个 1∼n1 \sim n 的排列 pp,满足 p1=s,pn=ep_1 = s, p_n = e,同时最小化这个排列的权值。一个排列的权值定义为 ∑i=1n−1f(pi,pi+1)\sum_{i = 1}^{n - 1} f(p_i, p_{i + 1}),其中

  • 若 i>ji > j,则 f(i,j)=xi−xj+ci+bjf(i, j) = x_i - x_j + c_i + b_j。
  • 若 i<ji < j,则 f(i,j)=xj−xi+di+ajf(i, j) = x_j - x_i + d_i + a_j。

你只需要求出排列的最小权值即可。

数据范围:1≤n≤5×1031 \leq n \leq 5 \times 10^3,s≠es \neq e,1≤x1<x2<⋯<xn≤1091 \leq x_1 < x_2 < \dots < x_n \leq 10^9,1≤ai,bi,ci,di≤1091 \leq a_i, b_i, c_i, d_i \leq 10^9。

时空限制:44s / 250250MiB。

Solution

连续段 dp 的一个好题。

注意到,相邻的两个数 i,ji, j 的贡献是独立的,只取决于他们之间的大小关系。这有助于代价提前计算。

考虑从小到大加数。不可当成仅一个连续段处理的原因是,插入一个数会破坏原有的相邻大小关系,无法计算代价。于是考虑连续段 dp,设 f(i,j)f(i, j) 表示填了数字 1∼i1 \sim i,形成了 jj 个连续段时的最小代价。有四种转移:

  • 将 ii 独自新开一个连续段:此时 ii 比两边都小。
  • 将 ii 接在某个连续段的左边:此时 ii 比左小,比右大。
  • 将 ii 接在某个连续段的右边:此时 ii 比左大,比右小。
  • 通过 ii 将某两个连续段合并:此时 ii 比两边都大。

特别地,在 p1=s,pn=ep_1 = s, p_n = e 的影响下,某些情况下的某些转移是不合法的。