前缀和
前提:数组每一维均从下标1位置开始存数
前缀和:类似于概念【数组的前i
项和】,是一种重要的预处理方式
对于一维数组:有n
个正整数放到数组ARR[]
中,求一个前缀和数组sum[]
,其中,sum[i]
是数组ARR[]
的第一项到第i
项和,由此背景,可以推出两个公式:
sum[1] = ARR[1]
sum[i] = sum[i - 1] + ARR[i]
根据这两个公式,可以将前缀和数组中任一一项求出,现在如果要求数组ARR[]
的第l
项到第r
项的和,则可以利用前缀和数组sum[]
与下列公式快速求出:
SUM = sum[r] - sum[l - 1]
对于二维数组:有n*m
个正整数放到二维数组ARR[][]
中,求一个前缀和数组sum[][]
,其中,sum[i][j]
是数组ARR[][]
的第一项和第i
项围成的矩形区域中所有项的和,如下图所示:
由此背景,可以推出两个公式:
前提:二维数组所有元素全部置0
sum[1][1] = ARR[1][1]
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + ARR[i][j]
,如下图所示:
根据这两个公式,可以将前缀和数组中任一一项求出,现在如果要求数组ARR[][]
的第(x, y)
项到第(l, r)
项的和,则可以利用前缀和数组sum[][]
与下列公式快速求出:
SUM = sum[l][r] - sum[x - 1][r] - sum[l][y - 1] + sum[x - 1][y - 1]
,示意图如下:
前缀和一般用于进行数组预处理,提高后续操作效率,多用于计算区间和