星际穿越
这道题忘记了,再推一遍。
引理1:我们最多只会向右跳一次,且向右跳操作一定在开始。
考虑从xi右边跳到左边的起始点z。如果我们经过了若干个点b,则由于z能跳到<xi的点,所以能跳到xi
显然我们不用跳b,直接从s跳到z即可。
如果我们在xi左边跨过xi跳到右边的点a,则显然一开始能从s跳到a,矛盾。
假设我们在第一次从右边跨过左边(或没有跨过左边)然后向左跳。
如果我们在这个过程中向右跳,假设跳到点d,我们第一次跳后(包含第一次)跳过的点序列为c。
则找到c中第一个大于d的元素e,则从e开始跳到d最优。
考虑bfs,每次求出距离当前点≤d的区域。
引理2:当d>1时区域是一个区间。
如果我们右跳后跳到节点的区间不能够覆盖xi,则显然还要右跳,矛盾。
考虑归纳。假设我们≤xi的区间为[l,xi]。
当d>1时,xi右边能跳到节点肯定能覆盖xi且是一个区间。
[l,xi]假若区间最小l值为v,则我们下一步显然能够跳到[v,xi]
考虑求出d增加1每一轮有多少节点不能到达。
假设我们区间覆盖li需要用d1步。
设一数列x,xj表示d=j时覆盖区间右端点。
我们需要求出∑d1i=2xi−(li−1)∗d1
求d1可以倍增。可以维护倍增时区间最小值。
x的和也可以用倍增维护。
还要预处理出后缀l最小值。
以上信息都可以在最多O(nlog2n)时间内维护。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步