题意
数轴上有 个点,每个点有属性 ,在第 个点可以花费 的步数移动至 中任意一个点。定义一次操作为选出一个 ,使 。
组询问,每次给出 ,求有 次操作机会时,从第 个点走到第 个点的最小步数。各组询问相互独立,即操作没有后效性。
题解
可以先想一个暴力,用 表示从 出发,走 步,至多操作了 次时能走到的最远点,查询时只需在 上二分 即可,依据是每次转移是连续的,跳到一个大于 的点必定可以跳到 。
由此有转移方程 ,原因也是能从若 走到 ,那 中的每个点都必定可以经过,即在其中取下一步的最远点,这个过程是 RMQ 问题,用 ST 表优化。
这样转移状态是 的,发现查询时的二分本质上就是步数的倍增,我们只关注走了 步的情况,改变 定义, 表示从 出发,走 步,至多操作了 次时能走到的最远点。转移方程为 ,初始化 ,直接枚举 转移,用 ST 表可做到 预处理。
对于每次询问,类似倍增求树上 级祖先,从 位开始从大到小考虑,令 表示考虑完 位,至多操作了 次时, 能去到最远位置,若对于所有 ,均满足 ,说明不存在任何转移方式可以通过这 步走到 ,换言之这 步是必走的,于是答案加上 ,并更新 ,否则这 步是不必要的,答案不变,并让 。
你发现每次询问都要预处理 次 ST 表,单次查询复杂度是糟糕的 ,但是对于每组询问, 是不变的,不必每次都预处理,于是把询问离线下来,对于每个 把每组询问都更新一遍即可。
总时间复杂度 ,空间复杂度 。
注意空间访问尽量连续,不知道会不会卡常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通