分块学习笔记

(2019/10/3 UPD:)
我回来填坑了

分块:

联想一下线段树,分块也是一种基于对数据进行信仰合理分治以提高处理效率的算法

考虑一下线段树是一分为二的树形数据结构,即有从属关系(一个节点的两子节点从属于它)
而分块是一种线性的分治方式,它把数据分成若干个互不影响的块,之后对于一些范围较大的询问在大块上整体查询,小块上暴力
考虑在大块上打整体标记记录整体信息,比如一个块的和或加法乘法标记(类似线段树的(lazytag)
然后是大家喜闻乐见的 块大小是(sqrt(n))的,合理脑补可以发现这个时候均摊复杂度最小 (O(nsqrt(n)))
想证明的话放个均值

可能有点抽象 脑补一个例题

给定长度为(n)的序列支持区间加区间求和,(n <= 10^5)
考虑预处理每个块的和,以及每个块上打加法标记
每次修改时大块直接打标记,小块暴力加在原数上
查询的时候同理,同时把加法标记累加到(ans)
...
大概讲了一下思想,其实和线段树有很多类似的地方,可以自行理解一下

另外一个很妙的(Point)是分块对于数据的分治是线性的,和线段树不同,线段树对数据的处理是有传递关系的(一个节点会继承它两个子节点的信息,虽然继承这个词不太妙),所以维护的信息一定要支持区间可加性,而分块由于块与块之间互不影响,可以维护更多类型的信息,但跑得比线段树慢

其实生活中很多地方也能遇到分块的思想,把算法推而广之应用至生活中岂不更为妙哉

原文地址:https://www.cnblogs.com/kma093/p/10295190.html