Processing math: 100%

星际穿越

这道题忘记了,再推一遍。
引理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步。
设一数列xxj表示d=j时覆盖区间右端点。
我们需要求出d1i=2xi(li1)d1
d1可以倍增。可以维护倍增时区间最小值。
x的和也可以用倍增维护。
还要预处理出后缀l最小值。
以上信息都可以在最多O(nlog2n)时间内维护。

posted @   celerity1  阅读(126)  评论(0编辑  收藏  举报
(评论功能已被禁用)
点击右上角即可分享
微信分享提示