前缀和与差分比较常用,也算是必须掌握的方法。主要用于对区间数据的查询处理。
在一维当中,前缀和就是指从某个元素开始一直到首个元素的和,差分是指每个元素与前一元素的差(首个元素即为本身)。
在二维里面,设一个N*M的矩阵,起点(左上角)为(1,1),终点右下角为(N,M)。则(i,j)的前缀和为以(1,1)为起点,以(i,j)为终点的矩形内所有元素的和;(i,j)的差分则是(i,j)-(i,j-1)-(i-1,j)+(i-1,j-1)。
比较有意思的是前缀和的差分和差分的前缀和即为各个元素。
前缀和主要用于区间求和,初始化复杂度为O(n),每次查询仅为O(1)。差分主要用于区间增加和单点查询,区间增加复杂度仅为O(1),单点查询相当于求差分数组的前缀和,复杂度为O(n)。区间增加,对于一维来说,要给[i,j]这个区间的每个元素加x,只需要令pre[i]+=x,pre[j+1]-=x即可(pre就是差分数组)。对于二维来说,要将(i,j,k,l)这个矩形内的每个元素都加x,则令pre[i,j]+=x,pre[i,l+1]-=x,pre[k+1,j]-=x,pre[k+1,l+1]+=x。
前缀和与差分一般并不单独考察,而是作为一种数据处理方式与其他知识点一起考察。
比如NOIP2012 借教室:https://www.luogu.org/problemnew/show/P1083