算法——差分

差分可以看作是前缀和的逆运算,前缀和可以帮我们快速得到某个区间的和,而差分就是我们将原数组看作是一个前缀和数组(q[])我们去构造一个差分数组(c[])

一维差分

使存在如下关系:

q[i] = c[1] + c[2] + c[3] +.....+ c[i]

-> q[i] = q[i - 1] + c[i]

-> c[i] = q[i] - q[i - 1]

eg: q = {2, 3, 6, 1, 7},下标从1开始方便讲解

按照上述规律我们可以构造出c = {2, 1, 3, -5, 6}

那么差分到底有什么用呢?

假设有这么一个场景我们现在给定一个区间[l, r]现在我们需要对原数组的[l, r]的数据都加上5,最直接的想法就是我们从l开始遍历到r然后给每个数+5,时间复杂度是O(n),如果我们现在需要执行m次如上操作就是O(n*m)这个开销不算太好。这时我们的差分就堂堂登场了,还记得差分的定义吗,原数组就是差分数组的前缀和,如果我们令c[l] + 5就是令q[l....]+5(因为l后的元素都会+c[l]),令c[r + 1] - 5就是令q[r+1....] - 5(因为r+1后的元素都会+c[r+1]),这两个一叠加就变成了q[l...r]+5了,我们只需要O(1)就能完成修改,执行m次的开销也只花费O(m),这有了极大的提升对于原来的暴力法。

代码实现:

int n, m;//n个数,m次修改
int q[n + 1], c[n + 1];

void change(int l, int r, int value) {
	c[l] += value;
	if(r + 1 <= n) c[r + 1] -= value;
}

int main() {
	for(int i = 1; i <= n; i++) c[i] = q[i] - q[i - 1];
	for(int i = 1; i <= m; i++) {
		int l, r, value;
		cin >> l >> r >> value;
		change(l, r, value);
	}
	//得到经过m次修改后的数组
	for(int i = 1; i <= n; i++) {
		q[i] = q[i - 1] + c[i];
	}
}

二维差分

二维差分的作用与一维差分是一样的,都是用来快速修改某个范围的数据,不过是从[l, r],变成了左上顶点(x1, y1) -> 右下顶点(x2, y2)。

我们还是先来确定一下原数组和差分数组的关系,q[x] [y]等于c[1] [1]到c[x] [y](左上顶点和右下顶点框出的矩阵)内的数据和:

q[x] [y] = c[1] [1] + ... + c[1] [y] + c[2] [1] + ...+c[2] [y] + ... + c[x] [1] +...+ c[x] [y];

我们可以画图来展现一下c数组:

 

通过上述规律我们可以知道:

红色:q[x-1] [y-1]

蓝色:q[x] [y-1]

深蓝色:q[x-1] [y]

绿色:c[x] [y]

我们可以得到这样的推论:q[x] [y] = q[x - 1] [y] + q[x] [ y-1] + c[x] [y] - q[x - 1] [y - 1],

移项后:c[x] [y] = q[x] [y] + q[x - 1] [y - 1] - q[x - 1] [y] - q[x] [y -1]

这样我们就可以通过原数组q来构造差分数组c

如果我们希望(x, y) 到 (x2, y2)范围内的数据都改变value。

 

参照一维差分的规律我们可以想到就是c[x] [y] +value,会使橙色范围的q+value,我们希望紫色范围的不发生改变,所以c[x2+1] [y] - value、c[x] [y2 + 1] - value, 但这样导致粉色区域多减了一次还需要加回来c[x2+1] [y2+1] + value,这样就完成了修改

代码实现:

int q[n+1][m+1], c[n+1][m+1];//下标都还从1开始

void change(int x1, int y1, int x2, int y2, int value) {
	c[x1][y1] += value;
	//注意边界判断这里就不写了
	c[x2 + 1][y1] -= value;
	c[x1][y2 + 1] -= value;
	c[x2 + 1][y2 + 1] += value;
}

int main() {
	//num次修改
	for(int i = 1; i <= num; i++) {
		int x1, y1, x2, y2, value;
		cin >> x1 >> y1 >> x2 >> y2 >> value;
		change(x1, y1, x2, y2, value);
	}
	//得到修改后的数据
	for(int i = 1; i <= n; i++) 
		for(int j = 1; j <= m; j++) 
			q[i][j] = q[i - 1][j] + q[i][j - 1] + c[i][j] - q[i - 1][j - 1];
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 EasyExcel 提升 Excel 处理效率

目录 前言1. EasyExcel 的优点2. EasyExcel 的功能3. 在项目中使用 EasyExcel3.1 引入依赖3.2 实体类的定义与注解3.3 工具类方法的实现3.4 在 Controller 中使用 4. 总结5. 参考地址 前言 在日常开发中&#xff0c;Excel 文件的处理是不可避免的一项任务&#xff0c;特别是在…

健康管理系统(Koa+Vue3)

系统界面(源码末尾获取) 系统技术 Vue3 Koa Nodejs Html Css Js ....... 系统介绍 系统比较简单,轻轻松松面对结业课堂作业.采用的是基于nodejs开发的Koa框架作为后端,采用Vue框架作为前端,完成快速开发和界面展示. 系统获取 啊啊啊宝/KoaVue3https://gitee.com/ah-ah-b…

python进阶-05-利用Selenium来实现动态爬虫

python进阶-05-利用Selenium来实现动态爬虫 一.说明 这是python进阶部分05&#xff0c;我们上一篇文章学习了Scrapy来爬取网站&#xff0c;但是很多网站需要登录才能爬取有用的信息&#xff0c;或者网站的静态部分是一个空壳&#xff0c;内容是js动态加载的,或者人机验证&…

day10性能测试(2)——Jmeter

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、LoadRunner vs Jmeter 1.1 LoadRunner 1.2 Jmeter 1.3 对比小结 2、Jmeter 环境安装 2.1 安装jdk 2.2 安装Jmeter 2.3 小结 3、Jmeter 文件目录结构 4、Jmeter默认配置修改 5、Jmeter元件、组…

架构15-服务网格

零、文章目录 架构15-服务网格 1、透明通信的涅槃 &#xff08;1&#xff09;服务网格 概念 服务网格是一种处理程序间通信的基础设施&#xff0c;主要由数据平面和控制平面组成。它通过边车代理和控制程序管理程序间的通信&#xff0c;弥补了容器编排系统对分布式应用细粒…

day08 接口测试(4)知识点完结!!

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、postman读取外部数据文件&#xff08;参数化&#xff09; 1.1 数据文件简介 1.2 导入外部数据文件 1.2.1 csv文件 1.2.2 导入 json文件 1.3 读取数据文件数据 1.4 案例 1.5 生成测试报告 2、小…

2024年11月HarmonyOS应用开发者高级认证全新题库

注意事项&#xff1a;切记在考试之外的设备上打开题库进行搜索&#xff0c;防止切屏三次考试自动结束&#xff0c;题目是乱序&#xff0c;每次考试&#xff0c;选项的顺序都不同&#xff0c;作者已于2024年11月22日又更新了一波题库&#xff0c;题库正确率99%&#xff01; 新版…

【Python网络爬虫 常见问题汇总】

目录 1. 爬取图片出现403解决办法&#xff1a;设置请求头中的Referer字段 2.关于干坏事的问题后续不定期更新 欢迎共同探讨学习进步 1. 爬取图片出现403 问题出自案例9&#xff0c;已解决。 【Python网络爬虫笔记】9- 抓取优美图库高清壁纸 当在爬取图库图片时遇到 403 错误…

《探索形象克隆:科技与未来的奇妙融合》

目录 一、什么是形象克隆 二、形象克隆的技术原理 三、形象克隆的发展现状 四、形象克隆的未来趋势 五、形象克隆的应用场景 六、形象克隆简单代码案例 Python 实现数字人形象克隆 Scratch 实现角色克隆效果&#xff08;以猫为例&#xff09; JavaScript 实现 Scratc…

Mac软件推荐

Mac软件推荐 截图SnipasteXnipBob 快捷启动Raycast 系统检测Stats 解压缩The UnarchiverKeka&#xff08;付费&#xff09; 视频播放IINA 视频下载Downie&#xff08;付费&#xff09; 屏幕刘海TopNotchMediaMate&#xff08;付费&#xff09;NotchDrop&#xff08;付费&#x…

Linux——linux系统移植

创建VSCode工程 1、将NXP官方的linux内核拷贝到Ubuntu 2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 NXP官方开发板Linux内核编译 1、将.vscode文件夹复制到NXP官网linux工程中&#xff0c;屏蔽一些不需要的文件 2、编译NXP官方EVK开发板对应的Linux系统…

TikTok运营选什么网络?要用原生IP吗?

不管是跨境电商运营还是个人IP打造&#xff0c;TikTok都是必不可少的一个大流量平台。但运营TikTok必然要面临网络问题&#xff0c;如果没有妥当的解决方案&#xff0c;不仅难以获取流量&#xff0c;还可能面临封号的风险。因此&#xff0c;选择可靠的网络并合理使用是非常重要…

Spring 基础

什么是 Spring 框架? Spring 是一款开源的轻量级 Java 开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地协助我们进行开发&#…

Redis篇-5--原理篇4--Lua脚本

1、概述 Redis 支持使用 Lua 脚本来执行复杂的操作&#xff0c;这为 Redis 提供了更强的灵活性和性能优化能力。通过 Lua 脚本&#xff0c;你可以在服务器端执行一系列命令&#xff0c;而不需要多次往返客户端与服务器之间&#xff0c;从而减少了网络延迟并提高了效率。此外&a…

【数据库】关系代数和SQL语句

一 对于教学数据库的三个基本表 学生S(S#,SNAME,AGE,SEX) 学习SC(S#,C#,GRADE) 课程(C#,CNAME,TEACHER) &#xff08;1&#xff09;试用关系代数表达式和SQL语句表示&#xff1a;检索WANG同学不学的课程号 select C# from C where C# not in(select C# from SCwhere S# in…

【git】--- 通过 git 和 gitolite 管理单仓库的 SDK

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。【git】--- 通过 git 和 gitolite 管理单仓库的 SDK 开发环境一、安装配置 gitolite二…

HDFS高可用模式安装部署

实验步骤 将ZooKeeper集群模式启动获取安装包 安装包在本地&#xff1a;通过XFTP等工具将安装包上传到虚拟机中安装包在网络&#xff1a; 虚拟机可以访问互联网虚拟机无法访问互联网解压缩安装包将解压出来安装目录重命名配置环境变量刷新环境变量&#xff0c;使新增的环境变量…

mysql程序介绍,选项介绍(常用选项,指定选项的方式,特性),命令介绍(查看,部分命令),从sql文件执行sql语句的两种方法

目录 mysql程序 介绍 选项 介绍 常用选项 指定选项的方式 ​编辑配置文件 环境变量 选项特性 指定选项 选项名 选项值 命令 介绍 查看客户端命令 tee/notee prompt source system help contents 从.sql文件执行sql语句 介绍 方式 source 从外部直接导入…

PDF处理的创新工具:福昕低代码平台尝鲜实现PDF2word功能

在当今数字化时代&#xff0c;PDF文件的处理和管理变得越来越重要。福昕低代码平台是新发布的一款创新的工具&#xff0c;旨在简化PDF处理和管理的流程。通过这个平台&#xff0c;用户可以通过简单的拖拽界面上的按钮&#xff0c;轻松完成对Cloud API的调用工作流&#xff0c;而…

【C++】C++11(统一列表初始化、声明、右值引用)

&#x1f308;个人主页&#xff1a;秦jh_-CSDN博客&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 ​ 目录 C11简介 统一的列表初始化 &#xff5b;&#xff5d;初始化 std::initializer_list 声明 …