ARC072C - Alice in linear land 题解

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

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

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

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

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

posted @ 2021-03-02 20:46  ycx060617  阅读(60)  评论(0编辑  收藏  举报