ARC072C

顺着算。显然任意时刻,你与终点的距离是唯一需要关心的。首先容易想到的是,对询问 (i),显式地求出 (1sim i-1) 作用后的距离 (v)。然后经过 (i) 的作用显然可能变成任意 (0sim v)。那么该问是 NO 当且仅当,(0sim v) 所有数经过 (i+1sim n) 的作用之后都是 (0)

我们考虑研究,对于一个初始的距离,经过若干作用变成的距离关于初始距离的函数。如果 (i+1sim n) 对应的函数的 (0sim v) 的值都是 (0) 的话,就 NO。

但是这个函数太难研究或者维护了。后来我又想研究该函数的前缀最大值,看 (v) 处是不是 (0)。但是这个前缀最大值函数依然难以研究。

接下来就是我想不到的部分了。注意到 (0) 这玩意很特殊,没有值比它更小了,我们大可不必研究更强的问题(研究函数本身),只需要管它的最长 (0) 前缀即可。这是一个值(而不是一整个函数),直接从后往前推的时候记录一下,看看能否递推。设上一秒的最前不为 (0) 的地方是 (g)。恰巧,感性理解可以得到这个函数无论经过多少次作用都是连续的(即 (|f(x)-f(x+1)|leq 1)),所以一定有 (f(g)=1)。然后我们要求出经过新加进来这个作用先作用之后,得到的值在 (f) 上映射到不为 (0) 的最前面的值。脑子想象一下过程,一开始在 (0sim g-1) 里面步长最多为 (1) 地瞎走,想要逃出去,必定先经过 (g)。于是新的 (g) 就是使得 (min(x,|x-d|)=g) 的最小 (x)(牛逼吧),讨论一下即可。

这个故事告诉我们:要解决一个问题的时候,我们经常会情不自禁地研究比它更强的看起来更普遍的问题,而恰恰忽略了原问题的特殊性。利用好原问题的特殊性往往能使问题变得更简单,就像这题一样迎刃而解了。

珍爱生命,远离抄袭!
原文地址:https://www.cnblogs.com/ycx-akioi/p/solution-arc072c.html