前缀和/差分

1. 前缀和

O(n) 预处理,多次 O(1) 查询。

1.1 一维前缀和

给你一个 n 个数的序列 a,多次查询 lr 的和。

维护 bi=i=1iai,查询区间 lr 的和就是 brbl1

1.2 二维前缀和

给你一个 nm 列的矩阵 a。接下来有 q 次查询,给定参数 x1,y1,x2,y2。请输出以 (x1,y1) 为左上角, (x2,y2) 为右下角的子矩阵的和。

bi,j(1,1)(i,j) 这个矩阵的和,由容斥原理,可得递推式 bi,j=bi1,j+bi,j1bi1,j1+ai,j

如果要求 (x1,y1) (x2,y2) 的矩阵和,那么 ans=bx2,y2bx11,y2bx2,y11+bx11,x21

2. 差分

支持 O(1) 修改,最后 O(n) 查询。

1.1 一维差分

给你一个 n 个数的序列 b,每次操作令 lr 集体加上 v,最后求序列 a

ai={0i=1bibi1i>1,令 lr 集体加上 v 就是 al+var+1v,最后对 a 做一遍前缀和就得到了最终结果,这是因为前缀和和差分是互逆运算。

1.2 二维差分

给你一个 nm 列的矩阵 bq 次操作,每次给定参数 x1,y1,x2,y2,v,将子矩阵 (x1,y1)(x2,y2) 加上 v,最后输出矩阵 b

由于前缀和和差分是互逆运算,设 ab 的差分数组,对前缀和的递推式做代数变换可得 ai,j=bi,j+bi1,j1bi1,jbi,j1

将子矩阵 (x1,y1)(x2,y2) 加上 v,其实就等价于

{ax1,y1+vax2+1,y1vax1,y2+1vax2+1,y2+1+v

最后对于 a 数组做一遍前缀和就可以得到 b 数组了。

二维前缀和/差分看起来很麻烦但其实画个图很好理解。

posted @   zhuluoan  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示