【luogu P7599】雨林跳跃
雨林跳跃
题目大意:luogu P7599
题目大意
有一排数,它们互不相同。
我们将移动定义为向左或向右走到第一个大于它的数。
现在多组询问,每次给出起点范围和终点范围,要你选起点终点,然后能走到而且用的步数最少。
如果无论如何都走不到终点就输出 -1。
思路
小性质
首先我们要发现一些性质:
是不会有跳到终点区间右边再跳回来的情况。因为终点在起点右边,那你要跳到终点右边,你跳到的位置一定会大于你起点到当前点的值,那你这个值已经比答案区间的所有值都高了,就跳不回去了。
那你就想到有往左走和往高走两个选项。
一个是为了走到终点,一个是为了更快的走到要的高度。
终点
我们设 是 区间最高的, 是 区间最高的。
那最后一步一定是这样的:
从一个高于等于 小于 的地方向右跳,而且要 是 区间最高的。
那这样跳就会跳入 区间,就在答案区间中,我们把这些 叫做准终点。
那其实问题可以是如何最快走到准终点,那终点也确定了,就根据高度的限定。
确定起点
那接着我们开始想一些问题,起点选哪个?
先说说结果,如果有准终点就它,否则选 中最高的 使得 中除了 最高,当然它要小于 。
为什么呢?有准终点就很显然,没有的我们画图看看:
( 是选的, 分别表示它左跳右跳跳到的位置)
( 一定不在 段,否则它才是 )
由于 间没有准节点,所以 会比 高。(如果不比它搞那它就应该是 )所以 间都不能做起点。而如果 跑到 左边,虽然不一定比 高,但它就属于后面证好的 中,不需要证了。
之间由于 跳到 有都低于 ,所以要跳出去一定会碰到 其中一个,所以不优。
之间同样的道理,但由于 不在 中,那 必然一次到 ,故别的不会比 更优。
那就从 最优。
那接着说说怎么找到,那容易看到就是从 开始不停往左跳,如果跳到的下一个在 左边或大于 就不跳停下。
跳的策略
那接着就是要怎么跳了。
那如果两边都能跳,而且跳了都不会大于等于 ,那肯定选高的跳,加快速度。
那如果跳高的发现大于等于 ,那就判断一下这样是不是在准终点,如果是就走。
否则不走,然后一直往右跳,直到跳到准终点。(当然如果跳不到就是无解)
怎么跳
容易想到倍增,就倍增左跳,右跳,高跳。
然后一开始求 是求区间最大值,可以用 ST 表来搞。(当然也要倍增)
代码
__EOF__

本文链接:https://www.cnblogs.com/Sakura-TJH/p/luogu_P7599.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现