$dp$ + 线段树.
- 显然只有关键点有用.设 $f(i)$ 表示到了第 $i$ 个关键点时的最小损失.把起点看做第 $0$ 个关键点,转移有:
$$
f(i)=\min_{j=0}^{i-1}\lbrace f(j)+ \lceil \frac {T_i-T_j} D \rceil\cdot A\rbrace - b_i
$$
- 这样大力转移是 $O(n^2)$ 的.注意到 $D$ 是固定的,考虑把 $T$ 写成 $T=C\cdot D+E,0\leq E<D$ .
- 那么原式就可以变成
$$
f(i)=\min_{j=0}^{i-1}\lbrace f(j)+ A\cdot (C_i-C_j)+[E_i>E_j]\cdot A\rbrace - b_i
$$
- 以 $E$ 为下标建一颗动态开点的线段树,在 $E_j< E_i,E_j\geq E_i$ 两部分分别查询 $f_j-A\cdot C_j$ 的最小值即可.
注意把 $Tree[0].val$ 初始化为 $inf$ .
1 |
|