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

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

差分数组:

首先给定一个原数组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

          局部变量不可以

#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;
}

 

相关推荐

  1. 进化算法

    2024-03-25 22:00:06       18 阅读
  2. 【基础算法练习】前缀和与模板

    2024-03-25 22:00:06       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 22:00:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 22:00:06       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 22:00:06       82 阅读
  4. Python语言-面向对象

    2024-03-25 22:00:06       91 阅读

热门阅读

  1. 【暴刷力扣】15. 三数之和

    2024-03-25 22:00:06       37 阅读
  2. 有向图的BFS(c++题解)

    2024-03-25 22:00:06       41 阅读
  3. 第几个幸运数字 蓝桥杯刷题

    2024-03-25 22:00:06       38 阅读
  4. 2024/3/23 蓝桥杯

    2024-03-25 22:00:06       40 阅读
  5. Android--重构

    2024-03-25 22:00:06       45 阅读
  6. Python从入门到精通秘籍十八

    2024-03-25 22:00:06       33 阅读
  7. MySql Error Code:2006 - MySQL 服务器已离线问题解决

    2024-03-25 22:00:06       39 阅读
  8. 用汇编进行字符串匹配

    2024-03-25 22:00:06       43 阅读
  9. CentOS7.9安装MySQL5.7

    2024-03-25 22:00:06       38 阅读
  10. 五种主流数据库:分组统计

    2024-03-25 22:00:06       41 阅读
  11. VS实用快捷键小技巧

    2024-03-25 22:00:06       36 阅读