算法基础之差分和前缀和

news2024/11/20 21:24:59

差分

差分介绍

结论:差分是前缀和的逆运算

举例

一维差分
//一维前缀和 a[i]部分就是一维差分数组
s[i] = s[i-1]+a[i];
//一维差分 
a[i] = s[i]-s[i-1];

二维差分
//二维前缀和 a[i][j]部分就是一维差分数组
s[i][j] = s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
//二维差分
a[i][j] = s[i][j]-s[i-1][j]-s[i][j-1]+s[i-1][j-1];

差分用法

用在一维子区间里的数都增减一个固定值,把对于区间内每个数的操作转换为对于差分数组中的端点的操作,时间复杂度降为o(1)。

用在二维子矩阵里的数都增减一个固定值,把对于子矩阵的每个数的操作转换为对应差分二维数组各个端点的操作。

总体思想就是在需要处理的区间范围内增减一个固定值,在影响到的其他范围内需要恢复,即相反操作。

举例

一维差分

差分数组在左端点增加c之后,会影响以其开始前缀和都增加c。所以为了确保只有LR这段增加c,需要从R+1开始减少c,即差分数组在R+1处减去c。

b[l]+=c;
b[r+1]-=c;

image-20230920173203393

二维差分

在 二维差分数组(x1,y1)增加会使得以(x1,y1)(n,m)范围内所有的数都增加c。所以为了确保只有(x1,y1)-(x2,y2)范围内数值增加c,则需要消除绿色部分的影响,做逆向操作。

b[x1][y1] += c;
b[x1][y2+1] -= c; //逆操作1
b[x2+1][y1] -= c;//逆操作2
b[x2+1][y2+1] +=c;//这块区域在逆操作1和2中减了两次,所以需要加上一次

image-20230920173814571

差分使用技巧

朴素思维

正常想法会先接收初始数组的输入,然后再计算每个差分数组。

一维数组
for(int i=1;i<=n;i++){
	cin >> a[i];
	b[i] = a[i]-a[i-1];
}
while(q--){
    int l,r,c;
    cin >>l>>r>>c;
    b[l] +=c;
    b[r+1] -=c;
}
二维数组
for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++){
		cin >>a[i][j];
		b[i][j] = a[i][j]-a[i-1][j]-a[i][j-1]+a[i-1][j-1];
	}

while(q--){
    int x1,y1,x2,y2,c;
    cin >>x1>>y1>>x2>>y2>>c;
    
    b[x1][y1] +=c;
    b[x1][y2+1] -=c;
    b[x2+1][y1] -=c;
    b[x2+1][y2+1] +=c;
}
	

简化思维

把全0当做初始数组,即初始的差分数组都是0,。接收输入的时候就执行差分数组的修改操作,当接收问询的时候 也当做是执行差分数组的修改操作。这样就不用额外计算差分数组的具体值。

一维数组

void insert(int l,int r,int c){
	b[l] +=c;
    b[r+1] -=c;
}
for(int i=1;i<=n;i++){
	cin >> a[i];
	insert(i,i,a[i]); //起始点i到结束点i,只有一个元素的区间
}
while(q--){
    int l,r,c;
    cin >>l>>r>>c;
    insert(l,r,c);c
}
二维数组
void insert(int x1,int y1,int x2,int y2,int c){
	 b[x1][y1] +=c;
    b[x1][y2+1] -=c;
    b[x2+1][y1] -=c;
    b[x2+1][y2+1] +=c;
}
for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++){
		cin >>a[i][j];
		insert(i,j,i,j,a[i][j]); //起始点(i,j)到(i,j)只有一个元素的矩阵
	}

while(q--){
    int x1,y1,x2,y2,c;
    cin >>x1>>y1>>x2>>y2>>c;
    insert(x1,y1,x2,y2,c);
   
}

前缀和

前缀和分类

前缀和大体可以分为一维数组的前缀和和二维数组的前缀和。二维数组主要适用场景是矩阵相关的运算。

一维数组的前缀和

s[i] =s[i-1]+a[i]

二维数组的前缀和

总体思想:先计算以(1,1)为起始点 到各个点的区域总和,再用差值法计算给定的起始点到终点的区域总和

计算以(1,1)起始点的区域的总和

//计算s[i][j]的值
s[i][j] = s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];

image-20230923142223260

计算给定区域的总和

//计算(x1,y1)到(x2,y2)区域的值
s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]; //中间-1的部分都是起始点(x1,y1)的坐标

image-20230923142246046

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1038980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优思学院|如何解读Minitab中测量系统分析(MSA GRR)的结果?

在现代制造和质量控制过程中&#xff0c;精确的测量是至关重要的。为了确保我们的测量工具可靠&#xff0c;我们需要评估其重复性与再现性。这就是测量系统分析&#xff08;Measurement System Analysis&#xff0c;简称MSA&#xff09;的关键目标之一。以下将介绍如何使用Mini…

SPEOS—光学产品设计及仿真工具

SPEOS是ANSYS公司功能强大的光学仿真软件&#xff0c;用于光学设计、环境与视觉模拟、成像仿真等&#xff0c;强大的解决方案提供了可视化光学系统和直观的人机交互平台&#xff0c;其仿真技术已广泛用于汽车、电子电器、精密仪器、照明设备等领域。SPEOS软件内嵌ISO和CIE国际标…

漏洞挖掘篇(基础)

文章目录 方法概述 漏洞挖掘方法分类 静态分析技术动态分析技术 符号执行 符号执行的基本原理符号执行的应用漏洞挖掘-检测是否数组越界 污点分析 基本思想污点分析核心要素优缺点 词法分析 基本概念漏洞挖掘实战 实践一&#xff1a;基于词法分析和逆向分析的可执行代码静态检…

有关MySQL性能的分析,你知道哪些?

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。 😇😇😇有兴趣的话关注博主一起学习,一起进步吧! 一、SQL性能…

PyTorch深度学习实战——交通标志识别

PyTorch深度学习实战——交通标记识别 0. 前言1. 交通标志识别1.1 数据集介绍1.2 数据增强和批归一化 3. 交通标志检测相关链接 0. 前言 在道路交通场景中&#xff0c;交通标志识别作为驾驶辅助系统与无人驾驶车辆中不可缺少的技术&#xff0c;为车辆行驶中提供了安全保障。在…

【操作系统】24王道考研笔记——第五章 IO管理

第五章 IO管理 一、IO设备 1.1 基本概念与分类 1.2 IO控制器 电子部件 IO控制器组成 值得注意的小细节&#xff1a;①一个I/O控制器可能会对应多个设备&#xff1b; ②数据寄存器、控制寄存器、状态寄存器可能有多个&#xff08;如&#xff1a;每个控制/状态寄存器对应一个…

RK3566 linux添加rgb13h

一、DTS根节点增加节点 在根节点/{}下增加flash_rgb13h节点&#xff0c;节点内容如下&#xff1a; flash_rgb13h: flash-rgb13h {status "okay";compatible "led,rgb13h";label "gpio-flash";pinctrl-names "default";pinctrl-0 …

如何在JoySSL上申请免费的SSL证书

1&#xff0c;前往 JoySSL 的官方网站注册页面&#xff0c;创建一个账号并登录您的 JoySSL 账户。 扫码注册账号申请免费证书https://www.joyssl.com/certificate/select/free.html?nid52&#xff0c;找到并选择你需要的 SSL 证书相关的功能或选项。 3&#xff0c;提供您的域…

三周过PMP经验分享,用最少的时间拿3A!

今天分享一个大神的PMP备考经验&#xff0c;大佬就是大佬&#xff0c;三周过PMP还拿了3A&#xff0c;正在备考PMP的小伙伴&#xff0c;咱们共勉&#xff01; 第一周、阅读教材 之前是第六版教材&#xff0c;花了很长时间阅读和梳理框架。现在是第七版教材&#xff0c;内容少了…

快速发布服务到生产环境(手动操作)

背景介绍 虽然现在大部分项目都是用Jenkins搭建环境&#xff0c;自动化部署。但仍然存在一些小客户&#xff0c;只会单独上线一些关键服务&#xff0c;此时就需要手动去服务器里面部署了。此处用一个外业服务做例子&#xff0c;下面开始介绍。 进入服务器 一般需要申请服务器权…

使用BaGet 实现NuGet包私有化部署

本文主要介绍使用IIS部署 1.下载Baget&#xff0c;github下载&#xff0c;本文下载版本v0.4.0-preview2 2.解压&#xff0c;参考使用说明 3.安装环境&#xff0c;.NET Core Runtime&#xff0c;此处说明&#xff0c;.net7安装包是集成了 ASP.NET Core IIS Module的&#xff…

数据结构之时间复杂度空间复杂度的计算

数据结构&#xff1a;计算机如何存储数据的问题。DS关心的是如何高效的进行数据的读写。 算法&#xff1a;在特定的数据集上&#xff08;不关心怎么进行具体数据的读写&#xff09;&#xff0c;如何利用数据完成特定的功能。算法本质上就是一系列运算的先后集合。 那么&#…

电工-国产二极管型号、三极管型号的命名方式

根据半导体器件型号命名方法&#xff08;GB249-74&#xff09;规定&#xff0c;国产半导体由5共部分组成&#xff0c;二极管、三极管的型号命名方式也有5个部分&#xff0c;第一部分是标明晶体管数目&#xff08;二极管或是三极管&#xff09;。第二部分是三极管的材质标识&…

【ZLM】花屏现象记录

目录 事后小结 现象 tcpdump看下包的情况 移了两个摄像头到10.60.100.196 事后小结 花屏的现象&#xff0c;主要看链路时延的稳定性。 如果 ping -s 2000 ip , > 2ms已经带宽 2000*8*2/0.002s16Mbps&#xff0c;说明带宽不够&#xff0c;应该接近100Mbps左右。你可…

C#中使用Newtonsoft.Charp实现Json对象序列化与反序列化

场景 C#中使用Newtonsoft.Json实现对Json字符串的解析&#xff1a; C#中使用Newtonsoft.Json实现对Json字符串的解析_霸道流氓气质的博客-CSDN博客 上面讲的对JSON字符串进行解析&#xff0c;实际就是JSON对象的反序列化。 在与第三方进行交互时常需要封装对象&#xff0c;…

linux 防火墙iptables

iptables 是 Linux 中比较底层的网络服务&#xff0c;它控制了 Linux 系统中的网络操作&#xff0c;CentOS 中的 firewalld 和 Ubuntu 中的 ufw 都是在 iptables 之上构建的&#xff0c;只为了简化 iptables 的操作。同时&#xff0c;iptables 不仅仅是防火墙这么简单&#xff…

C/C++代码静态检测工具PC-Lint常见错误总结

目录 1、PC-Lint 概述 2、PC-lint 常见错误列举 3、PC-Lint报告的语法错误 4、总结 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到…

看文章-做笔记

看文章-做笔记 小蓝本

想要防止视频被盗?用它给视频加水印

随着社交网络的普及&#xff0c;越来越多的人喜欢在网上分享自己制作的视频&#xff0c;但是&#xff0c;共享的视频可能会被其他人传播和滥用。因此&#xff0c;保护自己制作的视频非常重要。 那怎样才能够防止别人盗用自己制作的视频呢&#xff1f;一种简单易行的保护方法是…

printContent 点击打印多页时第一页之前出现白页

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; printContent 点击打印多页时第一页之前出现白页 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; printContent 点击打印多页时第一页之前出现白页 原因分析&#xff1a; 提示&am…