arc072e

题目大意 

有一个人要去直线上lm远处的地方,他会依次给他的机器发出n个指令。第i个指令为di。他的机器收到一个指令x后,如果向目的地方向前进xm后比当前离目的地更近,就会向前移动xm,否则什么都不会做。

现在,给你q个询问,每一次给出一个x,问你能不能改变dx,使得这个人不能到达目的地。你可以决定把dx改成什么数。

题解

第一次看这一道题的时候一直在想一些猎奇做法,什么都想不出来,然后就弃了,今天看了一下题解的思路,好像只要方向对了就很顺了,并没有什么坑

每一次做出决策之后我们只会离终点越来越近,这是一个很好的性质,考虑根据这个性质做一些文章

假如我们当前要改变的是第x天的d,那么我们关心的其实就只是从第x+1天决策到第n天距离终点最近的无法达到终点的那一个点与终点的距离,这是很显然的,因为这个点是条件最宽松的

假设我们已经知道了这个距离,为fx,那么我们就只需要判断决策第1天到x-1天后离终点的距离和f[x+1]的大小关系,如果f更小我们直接走到哪里就可以了

现在问题就变成了怎么求f

这个也很简单
如果2*f[x+1]+1< d[x]那么f[x]=f[x+1]否则f[x]=f[x+1]+d[x]
第二条转移本质上就是一个复制粘贴的过程,把每一个可行位置都移动d[x]位,还是很好理解的

所以说还是要先analyse一下性质啊,不然就像是无头苍蝇一样。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值