Description
Link:CF704B
有 n 个元素,第 i 个元素有五个参数 xi,ai,bi,ci,di。
你需要求出一个 1∼n 的排列 p,满足 p1=s,pn=e,同时最小化这个排列的权值。一个排列的权值定义为 ∑i=1n−1f(pi,pi+1),其中
- 若 i>j,则 f(i,j)=xi−xj+ci+bj。
- 若 i<j,则 f(i,j)=xj−xi+di+aj。
你只需要求出排列的最小权值即可。
数据范围:1≤n≤5×103,s=e,1≤x1<x2<⋯<xn≤109,1≤ai,bi,ci,di≤109。
时空限制:4s / 250MiB。
Solution
连续段 dp 的一个好题。
注意到,相邻的两个数 i,j 的贡献是独立的,只取决于他们之间的大小关系。这有助于代价提前计算。
考虑从小到大加数。不可当成仅一个连续段处理的原因是,插入一个数会破坏原有的相邻大小关系,无法计算代价。于是考虑连续段 dp,设 f(i,j) 表示填了数字 1∼i,形成了 j 个连续段时的最小代价。有四种转移:
- 将 i 独自新开一个连续段:此时 i 比两边都小。
- 将 i 接在某个连续段的左边:此时 i 比左小,比右大。
- 将 i 接在某个连续段的右边:此时 i 比左大,比右小。
- 通过 i 将某两个连续段合并:此时 i 比两边都大。
特别地,在 p1=s,pn=e 的影响下,某些情况下的某些转移是不合法的。