P11239 [KTSC 2024 R2] 跳跃游戏 - Solution
感觉有点不明所以的题。
以下序列均为 1-index,假设
首先
然后我们要在一个长度极长的序列上做这个东西,当然只能离散化,然后将极长相邻
直接对着原序列做,讨论非常复杂,考虑将原序列按下标模
它可能来自上一层相同位置
-
已计算完毕的
f 单调不降,这是显然的,所以我们只用考虑上一层的f 。我们默认在线段树里面先将所有的a_i 加好,这是若干个区间加,均摊\Theta(q) 个。 -
我们的
f 要么来自上一层+a_i ,要么来自本序列的前面的某个f 。考虑这种差异的原因,当然是因为a_i < a_{i - 1} (或者f_{i - 1} 继承过来的更大),导致i 往后的一段a 跟a_i 相同的元素f 取f_{i - 1} 更优秀。由于f 具有单调性,这必然是i 开头的一段区间,可以线段树上二分求出,然后做区间覆盖。 -
不难发现,对于
a_{i} 相同的相邻的f ,不可能后面的取\max 前面却不取,所以只考虑a_i 等价段开头的f 即可。 -
还有一个问题,我们现在的复杂度是
\Theta(\frac{n}{k} + q \log q) ,k 很小怎么办。
注意到有些层它们内部只有一个种类的
时空复杂度
这个做法常数比较大而且细节不少,代码等有时间写的时候放在评论区。