分块
分块的基本思想是通过适当的划分,预处理一部分信息并保存下来,用空间换取时间,达到时空平衡。事实上,分块的算法更接近“朴素”,效率往往比不上树状数组和线段树,但是它更加通用且容易实现。
下面从题目入手
这道题的题意非常熟悉,毕竟我们之前拿线段树和树状数组都做过,对于分块算法来说,这道题处理起来要比另两种简单许多。
大致思路如下
首先我们先把这个序列分成 t = s q r t ( n ) t=sqrt(n) t=sqrt(n)个块,然后每一个块的首位分别是w[i]*t-t和w[i]*t.
对于每一个加操作,我们将其分成两步,第一步是对于整块进行加,我们可以开一个sum数组,下标表示第几个块,里面的存的值表示这个区间加的值的大小,然后对于不包括整个块的区间,就暴力的循环加上去.
所以分块算法大致就是秉承着大段维护,局部朴素的思路.
代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=50010;
int n;
int w[N]