差分

适用:某一数列第 n 到第 m 的数加 x;

思路:等差数列 前缀和

已知数列 a[n];

令 其中 l 到 r 项 加上 x

当然可以用 for 函数遍历,但如果数据太多就会超时;

高中知识:

等差数列 Sn = A1 + A2 +…….+An; An = Sn – Sn-1 ;

可以看出在等差数列中当我们令 Al + 1 (-1) 时Sl 以后的所有数都会+1 (-1)

例:数列 1 2 3 4 的 Sn 为 S1 = 1; S2 = 3; S3 = 6; S4 = 10;

当第二个数 + 1 时 : S1 = 1 ;S2 = 4; S3 = 7; S5 = 11;S2以后的 所有数都加上了 1 ;

可以看图理解

现在可以将An看成 x ,将 Sn 看做 a[n] ;

先求 a[n] 各项之间的“差” 存入 b[n];

然后令 b[l] + x ,b[ r + 1] -x ;

进行前缀和操作即可实现目的。

例题

输入一个长度为 n的整数序列。

接下来输入 m 个操作,每个操作包含三个整数 l ,r ,c ,表示将序列中 [l,r]之间的每个数加上 c

请你输出进行完所有操作后的序列。

输入格式

第一行包含两个整数 nm

第二行包含 n 个整数,表示整数序列。

接下来 m 行,每行包含三个整数 lr c表示一个操作。

输出格式

共一行,包含 n 个整数,表示最终序列。

代码:

#include<bits/stdc++.h>

using namespace std;

const int N = 100010;
int n , m , a[N], b[N], l, r, c;

int main()
{
    cin>>n>>m;
    
    for(int i = 1; i <= n; i++ )
    {
        cin>>a[i];
        b[i] = a[i] - a[i-1]; 
    }
    while(m--)
    {
        cin>>l>>r>>c;
        b[l] += c;
        b[r+1] -= c;
    }
    for(int i = 1 ; i <= n ; i++)
    {
        a[i] = b[i] + a[i-1];
        printf("%d ",a[i]);
    }
    return 0;
}

上一篇
下一篇