这是 baozii 佬的废稿,我觉得很有意思所以做个记录,另外这是我第一次接触根号分治这种算法 不在提高组的大纲里我不会,那不是很正常。
给定一个长度为 n 的数组 ai(1≤ai≤n),然后有 q 个查询。
对于每个查询,给定 i 与 k,然后重复执行 i=i+ai+k,直至 i>n,求执行次数。
1≤n,q,k≤105
发现对于暴力算法,当 ai 与 k 为一个很小的数字时,整体复杂度为 O(n2)(n,q,k 同阶),显然超时。
如果我们预处理对于每个 i,k 的答案 ansi,k 呢?首先 O(n2) 的预处理还是会超时,其次开不出来 nk=1010 的数组。
结合上面两种思想,考虑分治。对于 k≥n,每次暴力查询的最大复杂度为 O(n),这时暴力是可行的,对于 k<n,预处理 ansi,k 的复杂度 O(nk) 可以接受。最终时间复杂度为 O(nn)。