一、前缀和
1.一维前缀和
一个数组a中前n项的和存储在数组S中,S0代表前0项的和,S1代表前一项的和,以此类推。
唯一的应用就是在计算第n项到第m项的和的时候,把时间复杂度降到n(1)。
由于内容过于简单,不多赘述。
2.二维前缀和
给出一个二维数组a,首先建立前缀和矩阵S,S[i][j]代表a数组前i行j列的和。
S[i][j]=S[i-1][j]+S[i][j-1]-S[i-1][j-1]+a[i][j];
这里为了方便起见,i和j都从1开始,原数组a也是如此;
应用:在一维前缀和基础上拓展,二维前缀和也应用在求原数组a的n^m矩阵-nn^mm矩阵;
=S[nn][m]+S[n][mm]-S[nn][mm];
由于代码过于简单,且关键公式已列出,不贴代码了。
二、差分
差分实质上是前缀和的逆运算,若a数组是b数组的前缀和,b就是a的差分。
应用:例如让a数组的[l,r]区间都加c,只需要b[l]+c,b[r+1]-c即可,降低时间复杂度。
差分可以理解为只有这一个操作,可以假定a数组原始都为0,每一个a[i]都是b[i]+a[i],b[i+1]-a[i]操作。
差分矩阵实际上就是前缀和矩阵的逆运算,再运用差分运算,用处理四个点代替四个矩阵,由于代码太简单了,懒得贴了,over【略略略