week5B 差分

题意:

给定一组数据n个,然后有n个操作。每个操作指定起始位置和终止位置,以及一个要进行操作的数。在这个区间内的每个数都加上这个操作数,在操作结束的时候,输出最后的数组。

input:

第一行数组元素个数n和操作次数k,第二行数组元素。此后每行都是三个数,分别为起点和终点,以及操作数。
在这里插入图片描述
数据范围:
在这里插入图片描述

output:

最后的数据元素。
在这里插入图片描述
思路:

最简单的暴力算法,即依次将区间内的每个数都加上操作数,最后输出,但数据较大,超时。
差分:依次记录下每个数据与前一个数据的差,即前i项和等于数据中的a[i],经过该处理后,区间的数据计算即变成了两点之间的计算,不妨设操作数为c,则只需在a[l]+c,和a[r+1]-c即可。在进行n此操作时,累加得到每一项的最后结果输出即可。

代码:

#include <cstdio>
long long a[10000000];
long long n;
long long q;


int main(){
	scanf("%lld %d",&n, &q);
	long long b1=0;
	long long b2=0;
	for(int i=0;i<n; i++){
		scanf("%lld",&b1);
		a[i]=b1-b2;
		b2=b1;
	}
	long long l,r,vau; 
	for(int i=0; i<q;i++){
	scanf("%lld %lld %lld",&l,&r,&vau);
		a[l-1]=a[l-1]+vau;
		a[r]=a[r]-vau;
	}
	

	long long sum=0;
	for(int i=0; i<n; i++){
		sum+=a[i];
		printf("%lld ",sum);
	}
	
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值