初论差分

初论差分

介绍:

其实最好用的时候是对于一段区间的值就行修改,并且是离线的!
那么用差分就是最好的了,将O(n)的复杂度变成了O(1)的点修改!

讲解

5!

5  6  12  7  9

那么类似的,我们用前缀的思想来处理相邻的差值!
所以存在了dif[ ] 数组里面!
dif[1]=5,dif[2]=1,dif[3]=6,dif[4]=5,dif[5]=2

那么如果我们将 区间 2~ 4 加上了 98 那么我们的暴力做法就是用一个循环来 保证,
但是我们可以直接将 dif[2]+=98,dif[5]=98

就变成了: dif[1]=5,dif[2]=99,dif[3]=6,dif[4]=5,dif[5]=97

那么最后结尾的时候,只要将前缀来相加就可以了!

a[1]=dif[1]+dif[0] = 5
a[2]=dif[2]+dif[1]=104 —dif[2]=104
a[3]=dif[3]+dif[2]=110 —dif[3]=110
a[4]=dif[4]+dif[3]=105 —dif[4]=105
a[5]=dif[5]+dif[4]=9 —dif[5]=9

代码:

#include <bits/stdc++.h>
#define N 10005
using namespace std;
int n,m,a[N],dif[N];
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        scanf("%d",&a[i]);
    dif[1]=a[1];
    for(int i=2; i<=n; i++)
        dif[i]=a[i]-a[i-1];
    for(int i=1; i<=m; i++)
    {
        int l,r,x;
        scanf("%d%d%d",&l,&r,&x);
        dif[l]+=x;
        dif[r+1]-=x;
    }
    for(int i=1; i<=n; i++)
    {
        dif[i]+=dif[i-1];
        printf("%d ",dif[i]);
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值