UNPKG

oi-wiki

Version:
37 lines (20 loc) 2.36 kB
在学习之前请先学习 [分块](/ds/square-root-decomposition/) 打表大家都知道,就是在比赛时把答案都输出出来,然后开个数组,把答案直接存入数组里于是你的代码时间复杂度就是 $O(1)$ 的了 但是需要注意这个技巧只适用于类似输出某函数值类的问题比如规定 $f(x)$ 为整数 $x$ 的二进制表示中 $1$ 的个数输入一个正整数 $n$,输出 $\sum_{i=1}^nf^2(i)$这样的话 $n$ 不大时,采用打表的方法可以做到 $O(1)$ 的复杂度 注意到这个问题其实十分的简单,采用一般做法也可以做到 $O(n\log n)$ 的复杂度,但是 $n=10^9$? 还有一些时候,打出来的表十分大,如果对于每一个 $n$,都输出 $f(n)$ 的话,那么 MLE 之外,还有可能代码超过最大代码长度限制,导致编译前不通过(代码可能直接被 pass) 我们考虑优化这个答案表,借用分块思想,我们设置一个合理的步长 $m$(这个步长一般视代码长度而定),对于第 $i$ 块,输出: $$ \Large \sum_{k=\frac{n}{m}(i-1)+1}^{\frac{ni}{m}} f^2(k) $$ 的值 然后输出答案时借用分块思想处理即可 一般来说,这样的问题对于处理单个函数值 $f(x)$ 很快,但是需要大量函数值求和(求积或某些可以快速合并的操作),枚举会超出时间限制,在找不到标准做法的情况下,分段打表是一个不错的选择 ### 注意事项 1. 当上题中指数不是定值,但是范围较小,也可以考虑打表; 2. 上题是本人为了介绍分段打表口胡出来的,如已有此题纯属巧合 ### 例题 [BZOJ 3798特殊的质数](https://www.lydsy.com/JudgeOnline/problem.php?id=3798):权限题……~~不过可以在各大 BZ 离线题库中看到。~~ [题意简述](https://www.zhihu.com/question/60674478/answer/180805562):求 $[l,r]$ 区间内有多少个质数可以分解为两个正整数的平方和。—— via PoPoQQQ [Luogu P1822魔法指纹](https://www.luogu.org/problem/show?pid=P1822):其实是一道暴搜,不过可以练练分段打表。 ~~明明是我先写的分段打表为什么你们这么熟练 QAQ,可以对比下[我的题解](https://blog.csdn.net/HeRaNO/article/details/78379324)的发布时间和 Luogu 中的。~~