颓了一天整整六个小时颓出来的题,写篇颓废纪念一下
是,的,没,错,这道题花了 我 t m 我^{tm} 我tm一整天。
好了不废话了,直接给出题目链接
如果想用更狠的官方数据来测,可以进这个OJ
老实说,蒟蒻感觉这题目有些绕……
一上来看到数据范围我吓呆了, n ≤ 500000 n \leq 500000 n≤500000……
考虑二分最少所花的金币 g g g。
左边界显然为1,右边界是 d d d 与最后一个点的距离 - d d d 中的较大值。
其实直接搞成那啥十万也可以。
我们显然要用一个 c h e c k check check 函数检查 g g g 枚金币够不够,也就意味着我们要检查从起点能跳的最大距离是否大于等于 k k k。
显然是个动态规划了。
在这里,设 a i a_i ai 表示格子 i i i 的距离, s i s_i si 表示格子 i i i 的值, f i f_i fi 表示从格子 i i i 出发能取到的最大值。
只要学过DP应该都会转移方程吧……
f i = m a x ( m a x f_i = max(max fi=max(max{ f j f_j fj } , 0 ) + s i ,0)+s_i ,0)+si