【算法】差分算法详解(模板)

类似于数学中的求导和积分之间的关系,差分可以看成前缀和的逆运算。

差分数组:

首先给定一个原数组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数组中从头开始的一段区间和。

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

例题:

分析:

首先让差分b数组中的 b[l] + c ,a数组变成 a[l] + c ,a[l+1] + c,,,,,, a[n] + c;

然后我们让b[r+1] - c,所得的数组就只是在[l,r]区间之内加c

补充:全局变量如果在定义时没有赋初值,编译器会自动赋初值为0

局部变量不可以

cpp 复制代码
#include<iostream>
#define N 100010
using namespace std;

int arr[N],diff[N];//全局变量 
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>arr[i];
		diff[i]=arr[i]-arr[i-1];
	}
	int l,r,c;
	for(int i=1;i<=m;i++){
		cin>>l>>r>>c;
		diff[l]+=c;
		diff[r+1]-=c;
	}
	for(int i=1;i<=n;i++){
		arr[i]=diff[i]+arr[i-1];
		cout<<arr[i]<<" ";
	}
	return 0;
}
相关推荐
AI科技星9 小时前
基于v≡c第一性原理的大统一力方程:严格推导、全维度验证与四大基本相互作用的统一
人工智能·线性代数·算法·机器学习·平面
小杍随笔9 小时前
【Rust 语言编程知识与应用:同步机制详解】
开发语言·算法·rust
sprite_雪碧9 小时前
枚举 / 搜索类算法(机试核心考点)
算法
罗湖老棍子9 小时前
简单题(信息学奥赛一本通- P1539)
数据结构·算法·树状数组·区间修改 单点查询
羊小猪~~9 小时前
【论文精度】Transformer---大模型基石
人工智能·深度学习·考研·算法·机器学习·transformer
西西弟9 小时前
常见排序算法集合(数据结构)
数据结构·算法·排序算法
伏 念9 小时前
大模型技术之LLM
人工智能·笔记·python·aigc
Yzzz-F10 小时前
[模板]Nim博弈
算法
小龙报10 小时前
【数据结构与算法】栈和队列的综合应用:1.用栈实现队列 2.用队列实现栈 3.设计循环队列
c语言·数据结构·数据库·c++·redis·算法·缓存
重生之我是Java开发战士10 小时前
【广度优先搜索】队列:N叉树的层序遍历,二叉树的锯齿形层序遍历,二叉树的最大宽度,在每个树行中找最大值
数据结构·算法·leetcode·广度优先