ARC073D

vjudge

标签 整体转移优化 DP

一个比较明显的一点是,只要棋子不是为了去完成要求移动到 \(x_i\),肯定是不动的。以后动肯定更优。

所以可以设计出一个 DP,令 \(f(i, j)\) 表示满足了前 \(i\) 个要求,现在一个棋子在 \(x_i\)(记为一号棋子),另一个在 \(j\)(记为二号棋子) 所花费的最小秒数。

转移分两类:

  • 让一号棋子从 \(x_i\) 移到 \(x_{i + 1}\)\(f(i, j) + |x_{i + 1} - x_{i}| \rightarrow f(i + 1, j)\)

  • 让二号棋子从 \(j\) 移到 \(x_{i+ 1}\)\(f(i, j) + |x_{i + 1} - j| \rightarrow f(i + 1, x_i)\)

\(g_j\) 表示现在的 \(f(i, j)\)。 观察两种转移,第一种就是所有 \(g_j\) 都加上 \(|x_{i + 1} - x_{i}|\);第二种只转移到 \(g_{x_i}\)

于是我们可以用线段树维护 \(g_i - i, g_i + i\) 的最大值,第二种转移每次单点修改即可。而第一种用个 \(sum\) 记录加的多少即可。

注意第二种转移时的时候要减去 \(|x_{i + 1} - x_{i}|\)。最后输出时加上 \(sum\) 即可。

时间复杂度:\(O(n \log n)\)

列出 DP 式子之后找到特点进行整体转移即可。

posted @ 2025-12-12 20:36  xiehanrui0817  阅读(1)  评论(0)    收藏  举报