CF1768F 题解
CF1768F Wonderful Jump 简要题解
题意:
请优化 \(DP\) 转移:
做法:
一个性质:
首先观察到一个性质:
如果从 \(l\) 跳到 \(r\) 那么,则一定有 \(a_l\) 是区间最小值或 \(a_r\) 是区间最小值, 如图:

直接从 \(l\) 跳到 \(r\) 的代价为:
先从 \(l\) 跳到 \(k\) ,再从 \(k\) 跳到 \(r\) 的贡献为:
显然,后者小于前者。
据此,我们可以优化 \(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\) ,如果这个跳跃要最优,那么就需要有:
即:
也就是说由于 \(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})\)

浙公网安备 33010602011771号