前缀和差分 精讲(一维、二维、附例题!)
这篇文章是我寻找众多博客总结归纳的,还有找到的部分经典例题,相信看完的你一定会有新的感悟!加油!
一、一维前缀和
一维的前缀和数组sum[ i ]就是存的是 前i个数的总和
。
那么x到y区间的总和就是 sum[ y ] - sum[ x ]
应用:
1、求一个数前面的所有数的和:递推;
2、求较多区间( l , r )之间的数的和:求前缀和之后 ans=a[r]-a[l-1]
;
例:HJ浇花、color the ball;
3、多组数据,每组数据都用同一总数组来操作,如果一组数据一组数据遍历的话很容易超时,那么可以将那个总数组答案化(即,将该数组修改成接下来的每组数据需要的数),接着按输入找数组就行了。
例:Olympiad;
4、将两种不同的物品分离,求最少的操作次数:一种物品从前面取前缀和,另一种从后面取“后缀和”,遍历所有点,总个数去掉两个数组里数即为不符合的需要改动的个数。
例:战马列队;
二、二维前缀和
二维的前缀和如sum[ i ][ j ]是指 (i,j)点的左上角的矩阵(从(1,1)开始)的各数总和。
求二维前缀和的方法:
a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
以下是对该式子的解释:
如图:图一点(i,j)的意义:红色区域的面积;假设其周围的数已求出前缀和,那么(i,j-1)点就是图二黄色区域的面积,(i-1,j)就是图三蓝色区域的面积。那(i,j)的求法是图一整个红色区域去点黄色和蓝色区域?不,多加了绿色区域,还要去掉绿色区域;
即:a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
应用:可以快速的求出矩阵中任何一个子矩阵的和,如:
1、求长为l且右下角顶点为(i,j)的正方形面积:
sum[i][j] - sum[i][j-l] - sum[i-l][j] + sum[i-l][j-l]。
2、求左上角为(x1,y1),右下角为(x2,y2)的矩形的面积:
sum[x2,y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
前提:矩阵中的所有的数已求前缀和;
我们要算的是 D区域 (以(x1,y1)为左上角,(x2,y2)为右下角的矩形) 的面积,那么sum[x2,y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]
即总的面积去掉A+B的面积去掉A+C的面积,多减了一个A的面积,再加上。
例:激光炸弹,最大正方形,Conturbatio。
三、一维差分
可以简单理解为:“相邻两个数之差”;
差分就是数组b对于数组a有b[ i ] = a[ i ] - a[ i-1 ](2 <= i <= n)
,b就是a的差分。
性质:差分的前缀和是原数组,前缀和的差分也是原数组(差分是前缀和的逆状态;
应用:给定多个区间,将区间里的所有数相加或相减一个数。如果挨个区间遍历的话,很可能超时,那么可以用差分:
例如 将区间(l,r)中的所有的数+1,将所有数差分后,a[l]++,a[r+1]--
; 再求前缀和即为变换后的区间;
例:fancy的区间、最高的牛、增减序列;
四、二维差分
根据二维前缀和表示的是右上角矩形的和,由于差分只涉及前面相邻的数(由一维可以推出),并且由前面范围的数相加得到这个位置的数。那么类比二维前缀和和一维差分,可以简单推测出二维差分的公式:
f[i][[j]=a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];
(二维差分就是二维前缀和的逆运算,所以与正好二维前缀和公式相反。)
性质:
- 二位前缀和通过二维差分后变换成原数组;
- 二维差分通过二维前缀和后也会变成原数组;
如何从差分矩阵得到原矩阵呢?
a[i][j]=f[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1];
(即前缀和公式);
应用:将所给矩形中的所有的数加上一个数或减掉一个数。
例:将以(x1,y1)为左上角,以(x2,y2)为右下角的矩形中的所有的数+c:
f[x1][y1]+=c; f[x1][y2+1]-=c; f[x2+1][y1]-=c; f[x2+1][y2+1]+=c;
再将二维数组求前缀和即得到变换后的数组;
对上述公式的解释:
- 前提:数组已二维差分;
- 如图:我们的目的是将图一紫色矩形中的所有数字+c,在一维差分中,区间中的数加减只需对边界操作,二维差分也是如此。
只是将点(x1,y1)
+c后会影响到全部的区域(即图二黄色区域,原因:之后要取前缀和),为了消除影响,则要(x1,y2+1)
-c,(即图三蓝色区域),(x2+1,y1)
-c(即图四蓝色区域),会发现有重复部分,去掉重复:(x2+1,y2+1)
+c;
模板:二维差分模板——差分矩阵;
例题:方格稿纸
参考来源:
https://blog.csdn.net/Zeolim/article/details/86770827
https://blog.csdn.net/mrcrack/article/details/99701435
https://blog.csdn.net/justidle/article/details/104506724
本蒻第一次写博客hh,肯定有不足的地方,欢迎各位大佬前来指正!
如果觉得还不错就鼓励一下吧hh(逃~~
前缀和差分 精讲(一维、二维、附例题!)相关推荐
- 差分——(2)二维差分
前面部分我们介绍了一维差分,https://blog.csdn.net/justidle/article/details/103761632.下面我们扩展一下,来介绍二维差分. 什么是二维差分 我们有 ...
- 一维二维码的提取、识别和产生
一维二维码的提取.识别和产生 零.相关说明: 在"jsxyhelu.cnblogs.com/机器视觉"栏目主要介绍和图像处理和机器视觉相关的的成套的解决方案.思路和软件集. ...
- php 冒泡排序数组,php一维二维数组键之冒泡排序
php一维二维数组键之冒泡排序 功能:对数组进行重新排序. 说明:冒泡排序 (一维数组)(二维数组某个健排序) 两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据 ...
- Matlab中矩阵编号方式以及一维二维三维数据间的相互转换
Matlab中矩阵编号方式以及一维二维三维数据间的相互转换 文章目录 Matlab中矩阵编号方式以及一维二维三维数据间的相互转换 一.问题的提出 二.一维数据转为二维和三维 三.三维数据转为一维和二维 ...
- 城市内涝一维二维耦合技术及在城市排水防涝领域中的实践应用
本次将聚焦于综合利用GIS.CAD及自研慧天排水数字化分析平台等工具高效地进行大规模城市排水系统水力模型的建立.在讲解过程中会以案例的形式演示与其他软件(如AutoCAD.ArcGIS.MS Offi ...
- python中quad_python用quad、dblquad实现一维二维积分的实例详解
背景: python函数库scipy的quad.dblquad实现一维二维积分的范例.需要注意dblquad的积分顺序问题. 代码: import numpy as np from scipy imp ...
- HEC-RAS水动力模型的一维二维及耦合建模
HECRAS是一款免费.功能丰富的水动力模型软件,在全球应用广泛.HECRAS一维模型因其界面友好,功能强大在我国得到了广泛应用.自2016年以来HEC(美国陆军工程兵团水文中心)新增了二维模块,以工 ...
- php判断几维数组的方法,PHP判断数组是一维二维或几维实例
PHP判断数组是一维二维或几维实例 导语:php中比较要的一个知识点就是数组了,你对数组的.认识有多少呢?下面的是百分网小编为大家搜集的PHP判断数组是一维二维或几维实例,供大家参考. //可以判断是 ...
- python中numpy中一维二维三维数组的意思
python中numpy中一维二维三维数组的意思: 以下为一维二维三维数组图形化: 那么一维通俗点就是行(横着看)只有这个,别无二家. 二维通俗点就是行(横着看)+列(竖着看),只有这种形式. 三维比 ...
- numpy数组切片:一维/二维/数组
文章目录 numpy数组切片操作 一维数组(冒号:) 1.一个参数:a[i] 2.两个参数:b=a[i:j] 3.三个参数:格式b = a[i:j:s] 4.例子 二维数组(逗号,) 取元素 X[n0 ...
最新文章
- R操作MySQL数据库创建表、删除表、增删改查(CRUD)
- OSS.Common扩展.Net Standard支持实例分享
- Spring WebClient和Java日期时间字段
- python删除txt指定内容_python删除文件中指定内容
- ReactiveX流式编程—从xstream讲起
- java调用MySQL脚本_Java调用SQL脚本执行常用的方法示例
- 跳过授权列表--skip-grant-list--案例
- 三大开源bi工具_Superset,基于web的开源BI工具,github三万star
- 网页上嵌入Flash播放器(2)
- Nginx与Zuul的区别
- 针孔微创牙龈手术(Pinhole Gum Rejuvenation)
- 阿里云提示ECS实例存在挖矿活动的处理
- GLSL 实现 FXAA 后处理效果
- c语言0x前缀的作用,有趣的问题,C语言程序中,为什么十六进制数字以前缀0x开头呢?...
- grep -w和grep -e使用
- 电脑硬件:蓝屏的常见解决方案
- [Error] expected primary-expression before ‘%’
- 让一切都过去吧,高手挑战2过关方法
- 读书 | 李开复自传:世界因你不同读后感1
- android 手机数据备份,如何备份和恢复Android应用数据