797 差分

题目


思路

-(中间的某个特定区间增加某一常数)
构造一个b数组,使得a数组每个元素是b数组相应元素的前缀和

  • (差分是前缀和的逆运算)在这里插入图片描述

  • 假设有数组b 如果 b[l] + c ,那么 前缀和a[l] 以后的每个元素都增加 c, 如果只想在特定,区间所有元素实现 增加一常数,只需要b[r+1] - c ,使得r之后的每个元素前缀和都减去c即可

  • 求原数组值 就是对差分数组求前缀和即可

  • 由于假定原数组全是0, 所以现有的a数组元素可以认为是差分得到的


代码

#include<iostream>

using namespace std;

const int N = 1e5 + 10;

int a[N], b[N]; 

void insert(int l, int r, int c)
{
	b[l] += c;
	b[r + 1] -= c;
}
int main()
{
	int n, m, cnt = 0;
	scanf("%d%d",&n, &m);
	for(int i = 1; i <= n; i ++)  scanf("%d", &a[i]);
	
	// 由于假定原数组全是0, 
	//所以现有的a数组元素可以认为是差分得到的 
	for(int i = 1; i <= n; i ++)  insert(i, i, a[i]);
	
	while(m --)
	{
		int l, r, c;
		scanf("%d%d%d", &l, &r, &c);
		insert(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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值