原数组:[3,1,4,1,5,9]
前缀和:[3,4,8,9,14,23]
差分:[3,2,3,3,4,4]

前缀和

通过前缀和数组,可以以 O(1) 的复杂度查询到一个连续区间内元素的和。

一维

构造方式

ps[i]=ori[1]+ori[2]++ori[i]

查询方式

ori[l]++ori[r]=ps[r]ps[l1]

二维

构造方式

ps[i][j]=ps[i1][j]+ps[i][j1]ps[i1][j1]+ori[i][j]

查询方式

(x1,y1)(x2,y2)= ps[x2][y2]ps[x11][y2]ps[x2][y11]+ps[x11][y11]

原理与上图类似,因此不画图了。

差分

通过差分数组,可以以 O(1) 的复杂度向一个连续区间内元素加上一个数。

一维

构造方式

df[i]=ori[i]ori[i1]

或者写成与下面统一的形式:

df[i] +=ori[i]df[i+1] =ori[i]

修改方式

给区间 [l,r] 中每个数 +c

df[l] +=cdf[r+1] =c

二维

构造方式

df[i][j] +=ori[i][j]df[i+1][j] =ori[i][j]df[i][j+1] =ori[i][j]df[i+1][j+1] +=ori[i][j]

修改方式

给区间 (x1,y1)(x2,y2) 中每个数 +c

df[x1][y1] +=cdf[x2+1][y1] =cdf[x1][y2+1] =cdf[x2+1][y2+1] +=c

原理与上图类似,因此不画图了。