差分算法

1,927 阅读1分钟

差分定义

差分是前缀和的逆序算。

原数组:a[1],a[2],a[3],a[4],a[5]
差分数组:a[1],a[2]-a[1],a[3]-a[2],a[4]-a[3],a[5]-a[4]

注意:原数组是差分数组的前缀和数组。

差分的作用

可以快速的对数组的某一个区间每个数加上一个常数。

用法

  1. 先求出原数组a的差分数组b
  2. 区间[l,r]中每个数加c执行的操作:b[l]+=c;b[r+1]-c;

例题

题目

给一个长度为n数组。
有m组操作,每个操作是在区间[l,r]中每个数加c。
最后输出操作后的数组。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int s[N];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>s[i];
    for(int i=n;i>=1;i--) s[i]-=s[i-1];//求差分数组
    while(m--)
    {
        int l,r,c;
        cin>>l>>r>>c;
        s[l]+=c;
        s[r+1]-=c;
    }
    for(int i=1;i<=n;i++)//对差分数组求前缀和得到原数组 
    {
        s[i]+=s[i-1];
        cout<<s[i]<<" ";
     }
    cout<<endl; 
    return 0;
}