差分的算法

这篇博客介绍了差分数组的概念及其在区间加法操作中的应用。通过构建差分数组,可以在O(1)的时间复杂度内完成区间[l, r]的数值加上c的操作,同时保持原数组不变。文章提供了详细的代码示例,展示了如何初始化差分数组、进行插入操作以及查询结果。强调了理解和实践这种高效算法的重要性。
摘要由CSDN通过智能技术生成

差分

思想:当我们要在一个数组a[N]的[l,r]区间之中+c的时候,我们可以再创建一个数组b[N],使之a[N]是b[N]的前缀和,b[N]是a[N]的差分,如b[1]=a[1],b[2]=a[2]-a[1]…b[n]=a[n]-a[n-1]。如果我们要在[l,r]加上c,就可以转化为在b[l]+c,b[r+1]-c,这样我们又没改变其a数组,又求出了在这个范围的数加上C的值,然后这个时间复杂度是O(1)的。

注意

他们都是从1开始存储的,因为开始留0是为了对付[l,r]=[1,10]这种情况。当然我们也可以想成原数组a[N]都为0,然后我们插入的a[i]就相当于c,这样也方便我们更好的去构建你所需要的差分数组。

代码。

#include<iostream>
using namespace std;
const int N=100010;
int a[N],b[N];
int n,m;
void insert(int l,int r,int c)
{
	b[l]+=c;//高深代码好好理解
	b[r+1]-=c;//好代码永远值得去读
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);//输入数据
	for(int i=1;i<=n;i++)insert(i,i,a[i]);//构建差分b[i]函数
	while(m--)//m次查询
	{
		int l,r,c;
		scanf("%d%d%d",&l,&r,&c);
		insert(l,r,c);//函数也用来在一个数值范围[l,r]加入c
		
	}
	for(int i=1;i<=n;i++)b[i]+=b[i-1];//构建前缀和
	for(int i=1;i<=n;i++)printf("%d ",b[i]);//输出加入后的值
	return 0;
}

结果。

在这里插入图片描述

总结。

一个好的程序员是要学会总结的,一定要花时间去重复理解,一定要去好好写几遍。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值