前缀和与差分
前缀和与差分
前缀和和差分更像是一种思想
一维前缀和
一维前缀和的定义:s[i] = s[1] + s[2] + ... + s[i]
用处:快速算一段区间的和:s[l] + ... + s[r] = s[r] - s[l - 1]
二维前缀和
二位前缀和的定义
如图,前缀和数组中(x1, y1)的值是原数组红色矩阵中所有数的和
作用快速求一个子矩阵中所有数的和
初始化
如图,在前缀和数组中的(x, y)可以表示为:原数组(x, y) + 前缀和数组浅黄部分 + 前缀和数组深黄部分 - 前缀和数组橙色部分
若a为原数组,s为前缀和数组,则求前缀和的公式为:s[i][j] = a[i][j] + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
求
左上角为(x1, y1),右下角为(x2, y2)的子矩阵中所有数的和为:
s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]
一维差分
差分是构造一个差分数组,使得差分数组的前缀和等于原数组
作用:快速给一段区间加上一个数,若差分数组为b,方式为:
void insert(int c) { b[l] += c; b[r + 1] -= c; }
差分数组构造方式:
因为上述公式的作用是维护此区间是个差分数组,所以可以把构造看成在只有一个数的区间插入一个c
二维差分
二维差分是在左上角(x1, y1),右下角(x2, y2)的子矩阵中同时加上一个数
二维差分的维护思想跟二维前缀和与一维差分类似
公式为:b[x1, y1] += c, b[x2 + 1, y1] -= c, b[x1, y2 + 1] -= c, b[x2 + 1, y2 + 1] += c;
本文作者:张詠然
本文链接:https://www.cnblogs.com/zyrddd/p/16225533.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析