算法基础之差分 学习笔记

差分

我们同样先从题目来插入
 首先 
输入用例为: 

6 1
1 2 3 4 5 6
2 4 1


表示的是输入6个数并进行1次查询
然后是6个数
最后查询是从第2到第4个的数每个加1,输出变化后的数列

背景知识:

上次我们在前缀和时,讲了遇到这种题目 暴力破解可以,直接for循环从i=2,i<=4就行,

但是如果数列比较大而查询的次数又比较多,

例如10个数查询50次

每次遍历1遍,需要500次,就会使得算法复杂度为O(n*m)

所以为了优化算法,降低复杂度,就出现了差分

(ps,为了方便理解,我将第三行三个数分别设为l,r,n;)

差分主要思想:是设一个数组,使得数组第l个加上n,第r+1个减n,将这个数组从一开始加上前

面的一项,就会造成l-r区间的每个数都加上了n

最后只要原数组按顺序加上这个数组即可得到结果

#include<stdio.h>
#include<string.h>
int N[6];
int sum[1000];
void add(int l,int r,int n)
{
	N[l]+=n;
	N[r+1]-=n;
 } 
 int main()
 {
 	int a,b;
 	int l,r,n;
 	scanf("%d %d",&a,&b);
 	
 	for(int i=1;i<=a;i++)
 	scanf("%d",&sum[i]);
 	
 	//这里就是差分的主要思路 
 	for(int i=0;i<b;i++)
 	{
 		scanf("%d%d%d",&l,&r,&n);
 		add(l,r,n);
    }
	 for(int i=2;i<=a;i++)
	 N[i]+=N[i-1];
	 for(int i=1;i<=a;i++)
	 sum[i]+=N[i];
	 
	 for(int i=1;i<=a;i++)
	 printf("%d ",sum[i]);
	 return 0;
 }

这篇文章以互相学习为主,有什么错的还望告知,谢谢啦

我们都是追梦人,我们都在努力前行!!!

(ps :小声bb, 如果有人看的话,我就会持续更新算法基础哦)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值