xtuoj 0x05-A 前缀和
题目
思路
本来采用的是最简单的方法,对他要操作的区间,用循环一个一个操作的,但是很明显超时啦。所以我就想到了可以对一段连续的区间批量进行加减操作,就是差分数组,然后用deepseek直接搜差分数组,然后get到三个点,第一个点就是差分数组怎么形成的,就是diff[i]=a[i]-a[i-1];第二个点是我想对 l 到 r 区间每个数都加上 d 怎么操作,就直接diff[l]+=d,diff[r+1]-=d;第三个点就是怎么还原数组,a[i]=a[i-1]+diff[i]。最后我们要求的是前缀和数组,再累加就好了,就是a[i]+=a[i-1],最后输出a[i]就好了,注意格式要求。
代码
#include<stdio.h>
#define N 100010
#define ll long longint n,m,l,r,d;
ll a[N],diff[N];int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%lld",&a[i]);diff[0]=0;for(int i=1;i<=n;i++) diff[i]=a[i]-a[i-1];while(m--){scanf("%d%d%d",&l,&r,&d);diff[l]+=d;diff[r+1]-=d;}a[0]=diff[0];for(int i=1;i<=n;i++) a[i]=a[i-1]+diff[i];for(int i=1;i<=n;i++) a[i]+=a[i-1];printf("%lld",a[1]);for(int i=2;i<=n;i++) printf(" %lld",a[i]);printf("\n");return 0;
}