CF1768F 题解

CF1768F Wonderful Jump 简要题解

题意:

请优化 \(DP\) 转移:

\[dp_i=min(dp_j+\min_{j\le k\le i}(a_k)\cdot (i-j)^2) \]

做法:

一个性质:

首先观察到一个性质:

如果从 \(l\) 跳到 \(r\) 那么,则一定有 \(a_l\) 是区间最小值或 \(a_r\) 是区间最小值, 如图:

直接从 \(l\) 跳到 \(r\) 的代价为:

\[a[k]\cdot (r-l)^2 \]

先从 \(l\) 跳到 \(k\) ,再从 \(k\) 跳到 \(r\) 的贡献为:

\[a[k]\cdot ((k-l)^2+(r-k)^2) \]

显然,后者小于前者。

据此,我们可以优化 \(DP\) 。

优化:

假设当前处理 \(dp_i\) ,考虑从 \(dp_j\) 转移,那么分两类讨论:

  • \(a_j\) 为区间最小值

  • \(a_i\) 为区间最小值

先考虑前者:

我们可以维护一个单调栈(栈里元素严格递增)。

那么我们用 \(a_i\) 把栈里的一些元素给弹出后,剩下栈里的元素就是可以转移的位置,如图:

然后考虑后者:

这里发现只需要从 \(max(\) 单调栈里的最后一个元素的位置,上一个与 \(a_i\) 相同的元素的位置 \()\) 到 \(i\) 去转移。

到这里整理一下思路:

我们成功的将转移分为了两类, 并对每种情况分别处理了转移。

但目前时间复杂度仍然为 \(O(n^2)\)

对 \(a_i\) 分类讨论:

为了进一步优化,我们有必要将转移划分为以下几组:

  • \(i\) 为最小值且 \(a_i\le \sqrt{n}\) :

  • \(i\) 为最小值且 \(a_i>\sqrt{n}\)

  • \(j\) 为最小值且 \(a_i\le \sqrt{n}\)

  • \(j\) 为最小值且 \(a_i>\sqrt{n}\)

第一类:\(i\) 为最小值且 \(a_i\le \sqrt{n}\) :

那么根据上文所说的,你只需要去枚举 \(j\in [max(\) 单调栈里的最后一个元素的位置,上一个与 \(a_i\) 相同的元素的位置 \()\) \(,i]\) 去转移。

那么对于某个 \(a_i\) ,总的枚举次数是 \(O(n)\) 的。

而由于 \(a_i\le \sqrt{n}\), 所以总共这样的 \(a_i\) 只有 \(\sqrt{n}\) 个。

第二类:\(i\) 为最小值且 \(a_i> \sqrt{n}\) :

这里又有一个性质:

如果某个跳跃经过的点的最小值为 \(s\) ,那么这个跳跃的距离不会超过 \(\frac{n}{s}\) 。

证明:

假设跳跃的距离为 \(d\) 。

一个一个跳过去的代价最大值是 \(n\cdot d\) (因为每一次跳跃中的最小值的上限都是 \(n\) )

一次跳过去的代价是 \(s\cdot d^2\) ,如果这个跳跃要最优,那么就需要有:

\[s\cdot d^2<n\cdot d \]

即:

\[d<\frac{n}{s} \]

也就是说由于 \(a_i>\sqrt{n}\) 且 \(a_i\) 是区间最小值,那么上一次跳跃过来的距离就要小于 \(\frac{n}{a_i}< \sqrt{n}\) 。

所以最多只需要枚举 \(\sqrt{n}\) 个点的转移就行了。

第三类:\(j\) 为最小值且 \(a_i\le \sqrt{n}\)

如果 \(j\) 为最小值,那么 \(j\) 是目前单调栈里的元素,此时由于 \(a_i\le \sqrt{n}\) ,所以单调栈里的元素最多 \(\sqrt{n}\) 个。

暴力枚举即可。

第四类:\(j\) 为最小值且 \(a_i>\sqrt{n}\)

  • 当 \(a_j\le \sqrt{n}\) :单调栈里这样的元素只有 \(\sqrt{n}\) 个,暴力枚举即可。

  • 当 \(a_j>\sqrt{n}\) :由于第二类中的一个性质,有跳跃距离要小于 \(\sqrt{n}\) ,那么 \(i-j\le \sqrt{n}\) ,还是只用枚举 \(\sqrt{n}\) 个就够了。

总时间复杂度 \(O(n\sqrt{n})\)

posted @ 2026-09-25 10:04  wlhao  阅读(19)  评论(0)    收藏  举报