差分算法模板

差分算法模板

  • 一维差分
    • 一维insert函数(构造差分数组和实现区域加数操作)
    • 一维差分模板题
  • 二维差分
    • 二维insert函数(构造差分数组和实现区域加数操作)
    • 二维差分模板题

一维差分

差分主要是计算出某个区域段的数分别加上一个数

先给定一个原数组a:a[1], a[2], a[3], a[n];
然后我们构造一个数组b : b[1] ,b[2] , b[3], b[i];
使得 a[i] = b[1] + b[2 ]+ b[3] +, + b[i]
也就是说,a数组是b数组的前缀和数组,反过来我们把b数组叫做a数组的差分数组。换句话说,每一个a[i]都是b数组中从头开始的一段区间和。

差分数组公式: b[i] = a[i] - a[i - 1]

一维insert函数(构造差分数组和实现区域加数操作)

我们先来讲讲用insert函数实现区域加数操作

我们要记得,a数组是b数组的前缀和数组,比如对b数组的b[i]的修改,会影响到a数组中从a[i]及往后的每一个数

比如首先让差分b数组中的 b[l] + c ,a数组变成 a[l] + c ,a[l+1] + c, a[n] + c
理解了这一点,就可以推出以下的公式
在这里插入图片描述

b[l] + c,效果使得a数组中 a[l]及以后的数都加上了c(红色部分),但我们只要求l到r区间加上c, 因此还需要执行 b[r+1] - c,让a数组中a[r+1]及往后的区间再减去c(绿色部分),这样对于a[r] 以后区间的数相当于没有发生改变。

得出一维差分结论:给a数组中的[ l, r]区间中的每一个数都加上c,
只需对差分数组b做 b[l] + = c, b[r+1] - = c

同时,通过这个insert函数,我们也可以用来构造差分数组

void insert(int l, int r, int v)
{b[l] += v;b[r + 1] -=v;
}
for(int i = 1; i <= n; i++){cin >> a[i];insert(i, i, a[i]);  //差分数组默认初始化为}  

根据差分数组公式:b[1] = a[1] b[2] = a[2] - a[1],
可以试着 模拟几次数据
i = 1时, 在[1, 1] 这个区间 加上a[i]—> b[1] = a[1] b[2] - = a[1]
i = 2时候, b[2] += a[2] --> 也就相当于 b[2] = a[2] - a[1]
(前面i = 1的时候,减去过a[1],后面i = 2时,加上a[2])
这种做法就比较巧妙

一维差分模板题

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<cstdio>using namespace std;//一维差分模板
//差分的作用:就是用来计算某个区间断,加上某个数
//注意:差分和前缀和的数组下标都是从1开始的const int N = 1e5 + 10;
int a[N];  //原数组
int b[N];  //差分数组
//差分数组的前缀和就是原数组//差分数组的求法:
/*差分数组默认初始化为0,但是要实现,在某个区间端加上某一个数就要先有原来数组的数据,然后再进行加数的操作这里统一,可以使用insert(int l, int r, int v)函数来进行操作l代表左端点,r代表端点,v代表加的数的大小函数的作用:在区间[l, r]这个区间中,加上v这个数赋给原来数组的数据可以用  insert(i, i, a[i]);  例如 :b[1] = 0;  在i = 1的时候,在[1, 1]这个区间中插入 a[i]的值但是由于插入之后,后面前缀和数组也要发生变化,所以后面也得减去vb[l]变化 ,b[l]后面的也得变化,[l, r]也加上了v, 所以r + 1后面的,都减去v
*///注意:此处要假设  a[n] 是b[n]的前缀和
//即 : a[n] = b[1] + b[2] + b[3]...... + b[n];void insert(int l, int r, int v)
{b[l] += v;b[r + 1] -=v;
}int main()
{int n, m;cin >> n >> m;for(int i = 1; i <= n; i++){cin >> a[i];insert(i, i, a[i]);  //差分数组默认初始化为}  int l, r, c;while(m--){cin >> l >> r >> c;insert(l, r, c);}//算差分和数组for(int i = 1; i <= n; i++){b[i] += b[i - 1];    // 这里直接在原数组上进行了前缀和的计算,a[i] = b[i] + a[i - 1];}for(int i = 1; i <= n; i++){> 这里是引用cout << b[i] << " ";}return 0;
}

这里注意:算出差分数组b[i],并不是结果数组,结果数组是a[i],要对b[i]进行前缀和算出a数组

二维差分

一维变成二维,其他步骤基本没变化,变化的是insert函数

二维insert函数(构造差分数组和实现区域加数操作)

在这里插入图片描述
在这里插入图片描述

这里采用了acwing中一位大佬的题解,讲解的非常好
然后我们就得到了二维差分数组中的差分数组

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] -= cb[x2 + 1][y2 + 1] += c;
}

同样利用这个insert函数,也能构造出二维的差分数组,思路跟一维的类似,这里就不在详细说了,不懂的再去看看前面一维那部分的讲解。

二维差分模板题

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<cstdio>using namespace std;const int N = 1010;
int a[N][N],b[N][N];
int n, m, q;void insert(int x1, int y1, int x2, int y2, int c)
{b[x1][y1] +=c;b[x2 + 1][y1] -=c;b[x1][y2 + 1] -=c;b[x2 + 1][y2 + 1] +=c;
}int main()
{cin >> n >> m >> q;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]); //差分数组初始化}}//区间加上某个数int x1, y1, x2, y2, c;while(q--){cin >> x1 >> y1 >> x2 >> y2 >> c;insert(x1, y1, x2, y2, c);   }//算出a[n]for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){//可以在在b数组本身上进行前缀和加的计算()//方式一://b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];//也可以这样//方式二:用原数组进行 a[i][j] = a[i -1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j]a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j];} }for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){//方式一://cout << b[i][j] << " ";//方式二:cout << a[i][j] << " ";}cout << endl;}return 0;
}

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

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

相关文章

go语言开发工作中常用命令

Go 编程语言中的常用命令主要用于构建、测试、运行和管理项目。以下是一些常见的 Go 命令&#xff0c;以及它们对项目的用途&#xff1a; go run 用途&#xff1a; 编译并运行 Go 程序。 示例&#xff1a; go run main.gogo build 用途&#xff1a; 编译 Go 程序&#xf…

CNN:Convolutional Neural Network(上)

目录 1 为什么使用 CNN 处理图像 2 CNN 的整体结构 2.1 Convolution 2.2 Colorful image 3 Convolution v.s. Fully Connected 4 Max Pooling 5 Flatten 6 CNN in Keras 原视频&#xff1a;李宏毅 2020&#xff1a;Convolutional Neural Network 1 为什么使用…

NumPy:从初识到实战,探索Python科学计算的无限可能

NumPy 在浩瀚的Python编程世界中&#xff0c;有一个强大的库如星辰般璀璨&#xff0c;它是数据科学家、机器学习工程师乃至量化金融分析师手中的利器——NumPy&#xff0c;它以其高效的数据处理能力和便捷的矩阵运算机制&#xff0c;在科研与工程领域中占据着举足轻重的地位。…

Java BIO、NIO(通信/群聊系统、零拷贝)、AIO

Java BIO、NIO(通信/群聊系统、零拷贝)、AIO BIO、NIO、AIO特点和场景 BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;、AIO&#xff08;Asynchronous I/O&#xff09;是Java中用于处理I/O操作的三种不同的I/O模型&#xff0c;它们具…

P1080 [NOIP2012 提高组] 国王游戏 贪心

[NOIP2012 提高组] 国王游戏 传送门 题目描述 恰逢 H 国国庆&#xff0c;国王邀请 n n n 位大臣来玩一个有奖游戏。首先&#xff0c;他让每个大臣在左、右手上面分别写下一个整数&#xff0c;国王自己也在左、右手上各写一个整数。然后&#xff0c;让这 n n n 位大臣排成一…

C. Partitioning the Array - 思维 + gcd

题面 分析 如果让两个数满足对某一个数取模后相等&#xff0c;那么也就是 x m o d m y m o d m x mod m y mod m xmodmymodm&#xff0c;那么也就是 ( x − y ) m o d m 0 m o d m (x - y) mod m 0 mod m (x−y)modm0modm&#xff0c;因此可以推出&#xff0c;对于每一个…

day16 二叉树的最大深度 n叉树的最大深度 二叉树的最小深度 完全二叉树的节点数

题目1&#xff1a;104 二叉树的最大深度 题目链接&#xff1a;104 二叉树的最大深度 题意 二叉树的根节点是root&#xff0c;返回其最大深度&#xff08;从根节点到最远叶子节点的最长路径上的节点数&#xff09; 递归 根节点的的高度就是二叉树的最大深度 所以使用后序遍…

系列六、Spring Security中的认证 授权 角色继承

一、Spring Security中的认证 & 授权 & 角色继承 1.1、概述 关于Spring Security中的授权&#xff0c;请参考【系列一、认证 & 授权】&#xff0c;这里不再赘述。 1.2、资源类 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 20:58* Description: 测试资源*/ Re…

思科模拟器中环境条件设置第一步

一直设想若上图中的温度在不同房间显示和物理环境一样的结果。 于是乎看了 经过实验 原因是 在模拟器的physcial中设置就可以实现不同的温度。 接下来就是合理使用了&#xff01; 对类似实验感兴趣的同学&#xff0c;一起加入尝试&#xff1a;微信号imaguofeng 2024年1月14…

Matlab 一种基于机载LiDAR点云电力线自动提取方法之二

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前的方法在面对地面为水面时,由于地面点的缺失会导致电力线提取错误,因此这里使用CSF地面点滤波改进电力线的提取过程。关于CSF滤波的相关配置可以详看:Matlab CSF地面点滤波(插件),改进之后的代码如下所示…

自定义call/apply/bind函数

这里&#xff0c;我们使用原型方法给 Function 对象添加了 myCall、myApply 和 myBind 方法。 myCall 和 myApply 非常相似&#xff0c;它们的不同之处在于参数传递方式。 myCall 函数使用剩余参数语法 ...args 来传递参数&#xff0c;而 myApply 函数接受一个数组作为参数。…

maven的scop作用域依赖问题导致idea社区版报错

1. 错误&#xff1a;代码没改&#xff0c;卸了专业版后改用社区版出现以下报错 2024-01-08 16:34:29.374 ERROR [main] org.springframework.boot.SpringApplication.reportFailure:823 Application run failed java.lang.IllegalStateException: Error processing condition …

计算机找不到vcomp140.dll怎样修复?马上教会你修复dll问题

在计算机系统运行过程中&#xff0c;遭遇“vcomp140.dll丢失”的场景并不少见&#xff0c;这一问题的出现往往伴随着软件无法正常启动、运行时错误提示或者系统性能下降等现象。具体场景可能包括但不限于&#xff1a;用户在尝试打开某个依赖于Visual C Redistributable库的应用…

数据在AI图像修复任务中的核心作用

在人工智能&#xff08;AI&#xff09;领域&#xff0c;数据的重要性不言而喻。尤其在图像修复任务中&#xff0c;数据的精度和质量直接影响着AI模型的性能。图像修复是指利用AI技术自动识别图像中的缺陷或遮挡物&#xff0c;并对其进行修复或还原的过程。这项技术广泛应用于各…

基于pyradiomics影像组学特征提取

基于pyradiomics影像组学特征提取 特征提取&#xff1a;1 pyradiomics的使用&#xff1a;1.1&#xff0c;在python环境下安装pyradiomics:1.2,设置特征提取器&#xff0c;获得想要特征&#xff1a;1.2.1 图像类型1.2.2 目标特征设置1.2.3 特征提取器设置 2 代码示例;参考&#…

【web服务搭建实验】之nginx基础学习

目录 一、nginx的简介二、nginx安装实验虚拟主机的配置web服务器的主流实现方式-LAMP和LNMP 一、nginx的简介 Nginx是一款轻量级HTTP服务器&#xff0c;同时也是代理邮箱服务器&#xff0c;具备反向代理&#xff0c;通用代理的功能。支持多个系统&#xff0c;和不同操作系统。…

秒杀系统如何设计

秒杀系统主要有以下特点 1、高并发瞬时流量 2、热点数据 3、数据量大 4、库存的正确扣减 5、黄牛抢购 6、重复下单 7、对普通交易的影响 前后端缓存 首先是秒杀功能的开启&#xff0c;以及前端资源的访问&#xff0c;这部分内容一般都是提前放到CDN中&#xff0c;让这些静态…

图机器学习年度汇集

一、深度学习模型优化 在图机器学习领域&#xff0c;深度学习模型的优化尤为重要。今年的主要进展包括了利用先进的优化算法提高模型精度、减少训练时间以及对大规模图数据的适应性。部分团队还推出了定制化的深度学习模型&#xff0c;特别适用于复杂的图形结构和交互。 二、…

【算法】Java-二叉树的右视图(BFS、DFS两种解法)

题目要求&#xff1a; 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入…

e2studio开发三轴加速度计LIS2DW12(3)----检测活动和静止状态

e2studio开发三轴加速度计LIS2DW12.3--检测活动和静止状态 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()…