「CF704B」Ant Man

Description

Link:CF704B

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

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

  • i>ji > j,则 f(i,j)=xixj+ci+bjf(i, j) = x_i - x_j + c_i + b_j
  • i<ji < j,则 f(i,j)=xjxi+di+ajf(i, j) = x_j - x_i + d_i + a_j

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

数据范围:1n5×1031 \leq n \leq 5 \times 10^3ses \neq e1x1<x2<<xn1091 \leq x_1 < x_2 < \cdots < x_n \leq 10^91ai,bi,ci,di1091 \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) 表示填了数字 1i1 \sim i,形成了 jj 个连续段时的最小代价。有四种转移:

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

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