APIO 2024 试机赛 T1 题解
反正是试机赛,早点发出来也不要紧,所以就先发出来了。
容易观察到,我们每步总是向右走到可达的最远点。
然而,由于可能单步最优的解在区间外,因此不能直接倍增。
观察到区间最值一定要被选,因此考虑由其分段,变为两个存在一个端点处为最值的子问题。
容易发现这样从最大值开始,下一步必定跳到最小值,再往后必定跳到最大值……以此类推。
考虑如果离线,我们可以对区间的右端点推进扫描线,并维护出当前后缀最大值和最小值位置的单调栈。
这样,我们如果可以快速维护出这些后缀最值之间的树状关系,从而计算出当前节点的深度,即可得到答案。
假设计算时用到的是最大值,则我们只用知道最大值栈到根节点的距离。
考虑最大值栈上相邻两个点。
如果其之间存在数值在前缀最小值上,则答案相差 \(2\):需要先转去最小值,再转回最大值;如没有,且两者均在栈顶下面,那么其必定转到同一个最小值上,故答案相同。
可以发现,由于单次操作只会对相邻位置的差值造成贡献,可以用线段树维护。
使用主席树即可在线。
总复杂度 \(O(n\log n)\)。
本文来自博客园,作者:myee,转载请注明原文链接:https://www.cnblogs.com/myee/p/18197097/APIO2024-pre-T1-sol