分块学习与例题
分块 分块的算法网上讲解有很多,这里粗略讲讲 分块就是一种优雅的暴力方法 例如我们需要进行区间求和,区间修改的操作,假如我们使用暴力的方法,对于每一次修改每一次求和都枚举这个区间进行相关操作,时间复杂度是 \(O(n^2)\) ,对于一些数据量 \(>10^4\) 的问题稳定超时。 分块大致上是将一个长度为 n 的区间分成 \(\sqrt n\) 块,然后对于 n 次对区间的操作 l,r 可以转换成 对 块1 左边一格的单点操作以及对 块1 块2 区间操作加上对 块2 右边两格子的单点操作,同样时枚举进行暴力修改,对于一整块的我们对这个块打上标记,两边的我们暴力修改。当然对块的大小是仁者见仁,智者见智,当把块的大小设置为 \(\sqrt n\) 时不能通过,把块开小点可能会有意想不到的ac。 如此以来分块的时间复杂度为 \(O(n*\sqrt n)\) 以下是 LOJ 例题 传送门 LOJ #6277. 数列分块入门 1 题意 区间加法,单点查值 题解 belong[] 数组预处理出每一个节点所属的块的编号, lazy[] 数组为当前块所共同添加的数的大小,那么对与某个点 r 的查询,查询结果即为 \[ a[r]+lazy[belong[r]] \] #include <iostream> #include <algorithm> #include <cstdio>