[学习笔记] 前缀和与(树上)差分

发布时间 2023-10-06 17:13:32作者: _yiwei

还是复习笔记,因为我发现我都不会

数组 \(a=[1,9,1,9,4,5,1,4].\)

前缀和

前缀和数组 \(s = [1,10,11,20,24,29,30,34]\).

如何计算? \(s_i = s_{i - 1} + a_i\)

有什么用? 计算区间和,区间 \([l,r]\) 的和就是 \(s_r - s_{l - 1}\)

差分

差分数组 \(s' = [1,8,-8,8,-5,1,-4,3]\).

差分前缀和数组 \(s'' = [1,9,1,9,4,5,1,4]\).

发现差分数组做个前缀和就变成原数组了。

如何计算? \(s'_i = a_i - a_{i - 1}\)

有什么用? 在区间查询的基础上,可以进行区间修改。对区间 \([l,r]\) 进行区间加,\(s'_l+\Delta,s'_{r + 1} - \Delta\)。常常配合树状数组使用。

树上前缀和

  • 信息在点上:\(s_x + s_y - s_{lca} - s_{fa_{lca}}\)
  • 信息在边上:\(s_x + s_y - 2s_{lca}\)

树上差分

点差分

信息放在点上。对一段路径进行修改操作。

\[s'_x + \Delta,s'_y+\Delta,s'_{lca} - \Delta,s'_{fa_{lca}} - \Delta \]

边差分

信息放在边上。对一段路径进行修改操作。

\[s'_x + \Delta,s'_y+\Delta,s'_{lca} - 2\Delta \]