算法基础之差分

差分

我们同样先从题目来插入
首先
输入用例为:
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

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

 1 #include<stdio.h>
 2 #include<string.h>
 3 int N[6];
 4 int sum[1000];
 5 void add(int l,int r,int n)
 6 {
 7     N[l]+=n;
 8     N[r+1]-=n;
 9  } 
10  int main()
11  {
12      int a,b;
13      int l,r,n;
14      scanf("%d %d",&a,&b);
15      
16      for(int i=1;i<=a;i++)
17      scanf("%d",&sum[i]);
18      
19      //这里就是差分的主要思路 
20      for(int i=0;i<b;i++)
21      {
22          scanf("%d%d%d",&l,&r,&n);
23          add(l,r,n);
24     }
25      for(int i=2;i<=a;i++)
26      N[i]+=N[i-1];
27      for(int i=1;i<=a;i++)
28      sum[i]+=N[i];
29      
30      for(int i=1;i<=a;i++)
31      printf("%d ",sum[i]);
32      return 0;
33  }

 


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

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

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

posted on 2021-11-27 20:14  LonelinessKid  阅读(121)  评论(0)    收藏  举报

导航