APIO 2024 试机赛 T1 题解

反正是试机赛,早点发出来也不要紧,所以就先发出来了。


容易观察到,我们每步总是向右走到可达的最远点。

然而,由于可能单步最优的解在区间外,因此不能直接倍增。

观察到区间最值一定要被选,因此考虑由其分段,变为两个存在一个端点处为最值的子问题。

容易发现这样从最大值开始,下一步必定跳到最小值,再往后必定跳到最大值……以此类推。

考虑如果离线,我们可以对区间的右端点推进扫描线,并维护出当前后缀最大值和最小值位置的单调栈。

这样,我们如果可以快速维护出这些后缀最值之间的树状关系,从而计算出当前节点的深度,即可得到答案。

假设计算时用到的是最大值,则我们只用知道最大值栈到根节点的距离。

考虑最大值栈上相邻两个点。

如果其之间存在数值在前缀最小值上,则答案相差 \(2\):需要先转去最小值,再转回最大值;如没有,且两者均在栈顶下面,那么其必定转到同一个最小值上,故答案相同。

可以发现,由于单次操作只会对相邻位置的差值造成贡献,可以用线段树维护。

使用主席树即可在线。

总复杂度 \(O(n\log n)\)

posted @ 2024-05-17 08:06  myee  阅读(227)  评论(0编辑  收藏  举报