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\) 是全局最大值,也必定大于任何的局部最大值。
所以正常做就好了。比赛系统现在上不去我拿不到代码了。