[JOI Open 2019] 三级跳 / Triple Jump
三元组等多元组/子区间/子序列问题,求极值。
例如三元组 \((a,b,c)\) 求极值,可以关注两个数 \((a,b)\),再确定 \(c\) 的范围,这样枚举 \((a,b)\) 是 \(O(n^2)\) 的。有时最优的 \((a,b)\) 对不会很多,比如此题中,若 \((a,b)\) 区间中的 \(\max\) 大于 \(\min(v_a,v_b)\) ,那么可以考虑将 \(a\) 或 \(b\) 替换为 \(\max\) 所在位置,这样长度限制更宽松。那么有用的 \((a,b)\) 满足 \(\min(v_a,v_b) > \max_{a < i < b} v_i\),而这样的 \((a,b)\) 只有 \(O(n)\) 对,直接先枚举端点中 \(\min\) 所在位置,然后直接单调栈找到它左边和右边第一个大于等于它的数即可。