何为分块
在学习完线段树和树状数组后,这两种数据结构已经能够解决大部分的问题了,但在使用过程中不难发现他们的缺点
- 树状数组 O ( ( N + M ) l o g N ) O((N+M)logN) O((N+M)logN):局限性过大,不易扩展到普遍性题目
- 线段树 O ( ( N + M ) l o g N ) O((N+M)logN) O((N+M)logN):虽然能够扩展到许多题目,其也有许多类型,但不够直观,并且代码长,细节多…
分块应运而生
分块的基本思想是通过适当的划分,预处理一部分信息并保存下来,用空间换取时间,达到"时空平衡" ———《算法竞赛》
说得通俗一点,就是依据某种方法优化的暴力算法,相比线段树和树状数组,分块思路更简单,且更通用,代码容易实现。
分块的基本过程
分块,分块,顾名思义,是将一个序列分成若干段来进行操作。
通常将一个序列A分成若干个不超过 ⌊ N ⌋ \lfloor \sqrt{N} \rfloor ⌊N⌋的段,其中第i段的左端点为 ( i − 1 ) ⌊ N ⌋ + 1 (i-1)\lfloor \sqrt{N} \rfloor +1 (i−1)⌊N⌋+1,右端点为 m i n ( i ∗ ⌊ N ⌋ , N ) min(i*\lfloor \sqrt{N} \rfloor,N) min(i∗⌊N⌋