252 字
1 分钟
跳跃次数查询 根号分治

这是 baozii 佬的废稿,我觉得很有意思所以做个记录,另外这是我第一次接触根号分治这种算法 不在提高组的大纲里我不会,那不是很正常

题意#

给定一个长度为 nn 的数组 aia_i1ain1\le a_i\le n),然后有 qq 个查询。

对于每个查询,给定 iikk,然后重复执行 i=i+ai+ki=i+a_i+k,直至 i>ni\gt n,求执行次数。

1n,q,k1051\le n,q,k\le 10^5

题解#

发现对于暴力算法,当 aia_ikk 为一个很小的数字时,整体复杂度为 O(n2)O(n^2)n,q,kn,q,k 同阶),显然超时。

如果我们预处理对于每个 i,ki,k 的答案 ansi,kans_{i,k} 呢?首先 O(n2)O(n^2) 的预处理还是会超时,其次开不出来 nk=1010nk=10^{10} 的数组。

结合上面两种思想,考虑分治。对于 knk\ge\sqrt{n},每次暴力查询的最大复杂度为 O(n)O(\sqrt n),这时暴力是可行的,对于 k<nk \lt \sqrt n,预处理 ansi,kans_{i,k} 的复杂度 O(nk)O(n\sqrt k) 可以接受。最终时间复杂度为 O(nn)O(n\sqrt n)

跳跃次数查询 根号分治
https://zrn.net/posts/jump-forward-by-ith-plus-k/
作者
Poi
发布于
2025-01-16
许可协议
CC BY-NC-SA 4.0