算法笔记 / A LEAF IN THE GARDEN

前缀和与差分

算法笔记 · 算法理论 / 基础算法。来自 Daily Learning 的学习笔记。

介绍

一组对偶运算

graph TD
A([原数组])
B([前缀和数组])
C([差分数组])
A --前缀和--> B
A --差分--> C
B --差分--> A
C --前缀和--> A

作用

运算查询更新功能
前缀和O(1)O(1)区间查询O(n)O(n)单点更新快速求区间聚合值
差分O(n)O(n)单点查询O(1)O(1)区间更新快速区间更新

前缀和

一维前缀和

0 1 2 3 4 5 6 L-1 L R

递推公式

sumi=sumi−1+aisum_i = sum_{i-1} + a_i

区间和

sum(l,r)=sumr−suml−1sum_{(l,r)} = sum_r - sum_{l-1}

二维前缀和

x₁, y₁ x₂, y₂ x₁, y₂−1 x₂−1, y₁ x₂−1, y₂−1 0 1 2 3 4 5 0 1 2 3 4 5

递推公式

sumi,j=sumi−1,j+sumi,j−1−sumi−1,j−1+ai,jsum_{i,j} = sum_{i-1,j} + sum_{i,j-1} - sum_{i-1,j-1} + a_{i,j}

区间和

sum(x1,y1),(x2,y2)=sumx2,y2−sumx1−1,y2−sumx2,y1−1+sumx1−1,y1−1sum_{(x_1,y_1),(x_2,y_2)} = sum_{x_2,y_2} - sum_{x_1-1,y_2} - sum_{x_2,y_1-1} + sum_{x_1-1,y_1-1}

差分

一维差分

+k +k +k +k +k +k +k +k −k −k L R R+1

递推公式

di=ai−ai−1d_i = a_i - a_{i-1}

区间更新

a(l,r)+ka_{(l,r)} + k dl+k,dr+1−kd_l + k,\\ d_{r+1} - k

二维差分

+k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k +k −k −k −k −k −k −k −k −k −k −k −k −k −k −k −k −k −k −k −k −k +k +k +k +k

递推公式

di,j=(ai,j−ai−1,j)−(ai,j−1−ai−1,j−1)d_{i,j} = (a_{i,j} - a_{i-1,j}) - (a_{i,j-1} - a_{i-1,j-1})

区间更新

a(x1,y1),(x2,y2)+xa_{(x_1,y_1),(x_2,y_2)} + x dx1,y1+x,dx1,y2+1−x,dx2+1,y1−x,dx2+1,y2+1+xd_{x_1,y_1} + x,\\ d_{x_1,y_2+1} - x,\\ d_{x_2+1,y_1} - x,\\ d_{x_2+1,y_2+1} + x