前置芝士
暴力枚举,常数优化方法等。
什么是分块
分块思想实质上是一种是通过分成多块后在每块上打标记以实现快速区间修改,区间查询的一种算法。其均摊时间复杂度为 O ( n ) O(\sqrt{n}) O(n)
分块思想相较于各种树形数据结构,具有简便易写,方便调试等多种优点。在同等数据规模下,如 1 e 5 1e5 1e5 ,其时间效率并不会低太多,在考试时反而是一种有力的得分方法(骗分)。俗称优雅的暴力。 (选自CSDN博客,有删改)
思路
例题
如题,已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数数加上 x x x;
2.求出某一个数的值。
操作 1 1 1: 格式:1 x y k
含义:将区间 [ x , y ] [x,y] [x,y] 内每个数加上 k k k;
操作 2 2 2: 格式:2 x
含义:输出第 x x x 个数的值。
思路
假设你不会树状数组,那你只能暴力。暴力打了最多就70分,那怎么办呢?
那当然是分块啊,分块可以优化卡过去这道题。
于是我们想以样例为例进行模拟:
5 5
1 5 4 2 3
1 2 4 2
2 3
1 1 5 -1
1 3 5 7
2 4
思想
我们先把整个数列分成多个大小为 M M M的块(一般当 M M M为 n \sqrt{n} n是为最优)
n = 5 , M ≈ 2 n = 5,M ≈ 2 n=5,M≈2
则:
对于操作