apio2024试机题t1题解

首先有个直观的感受:在位置 \(i\) 我们能跳到位置 \(i\) 到下一个比 \(p_i\) 小的位置之间的最大值,或者是位置 \(i\) 到下一个比 \(p_i\) 大的位置之间的最小值。也就是 \(i\gets \max(\arg\max(i,\min(nxtmn_i,r)),\arg\min(i,\min(nxtmx_i,r)))\)。这么跳一定是最优的(感受一下,因为这样可以跳得尽量高或者低)。

如果不对 \(r\)\(\min\),那么上面的可以用倍增维护。问题在于这个取最小值。有个简单的方法,就是预处理倍增数组时不考虑对 \(r\)\(\min\),但保证倍增跳时不超过 \(r\),但这样其实不一定能跳到 \(r\)

找出序列中的最大值所在位置,我称这个位置为 \(mx\)。按 \(mx\) 将序列分成左右两个部分。容易发现 \(mx\) 一定必经的。所以将其分成两个部分解决并合并是正确的。

也就是说,将从 \(l\) 跳到 \(mx\) 的答案加上从 \(r\) 跳到 \(mx\) 的答案之和就是从 \(l\)\(r\) 的答案。

两个部分解决方法是一样的,下面举从 \(l\) 跳到 \(mx\) 部分讲。

因为 \(mx\) 是全局最大值所在位置,所以 \(mx\) 必定也是 \(l\)\(mx\) 最大值。

我们发现这时候必定能跳到 \(mx\) 了,因为 \(mx\) 是全局最大值,也必定大于任何的局部最大值。

所以正常做就好了。比赛系统现在上不去我拿不到代码了。

posted @ 2024-05-17 16:17  ZnPdCo  阅读(90)  评论(0编辑  收藏  举报