APIO2021
雨林跳跃
-
设
-
如果
那么一定有解,否则一定有解 -
可以发现越跳越高,并且 跳跃一段路程时一定满足自己已经比这一段的所有树都高 ,才能跳过去
-
所以最后一步跳跃一定是从一个高度为
树跳到右边的区间中,而且只可能从右区间的左边跳过去 -
一定有一个最优解以
中最长的右区间 (满足区间最高的高度 < T)中的最高点为起点 -
因为一个点跳的时候必须满足跳过去的时候 <Y ,所以右边不能有 >Y 的树,所以先确定区间
-
这个区间其实可以看成以右端点
为起点,每次跳 1 格判断是否 >Y ,那么可以用 倍增 + ST表 实现 -
将已经
的树不看了,因为一定没有解 -
那么剩下的树中,可以发现以其他点为起点的最优解要么跳到某一步后会跳到最高点,要么就是某一步之前都可以直接替换成最高点来跳
-
所以我们就以小于 Y 的最高点为起点求答案
-
所以现在等同于我们知道了跳跃的起点,跳跃的目标是以最少的步数跳到高度
的树 -
如果当前最高点已经满足要求了,那么可以直接返回 1
-
否则就需要求出到
这种树的最少的步数,最后 +1 -
假设当前点不满足要求,也就是
-
那么考虑下一步能跳到的两个地方,假设都
,考虑哪个地方更优 -
在
的树中,一定是跳的越高越好 ,可以通过分类讨论+画图发现 -
所以每次跳更高的树,当第一次遇到符合答案的高度时就可以直接跳到右区间了
-
注意到已经保证有解,所以这么跳一定会第一次遇到一个满足条件的树
-
但是可能在一颗树中的选择有一个满足条件,一个
,但是我们会跳到更高的树,不过这不影响答案,因为保证有解,所以我们跳到第一个 的地方就说明出现了符合高度的树 -
确定了起点,每一步会跳到的树也确定了,目标是求多少步第一次跳到高度
的树 -
那么显然可以倍增来做
-
虽然我写了代码,但是因为本人不知道洛谷的交互题怎么交,导致我无法确定代码的正确性,所以这个题就没有参考代码了
总结
-
倍增
-
其实这个题没有那么好想,很多性质需要去挖掘,需要先大胆猜测然后再尝试证明,直接看出来一个性质不是那么容易
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】