一维差分数组

 

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

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

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

输入格式

第一行包含两个整数 n和 m

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

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

输出格式

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

数据范围

1≤n,m≤1000001
1≤l≤r≤n
−1000≤c≤1000
−1000≤整数序列中元素的值≤1000

输入样例:
6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1
输出样例:
3 4 5 3 4 2
#include<iostream>

using namespace std;

const int N = 100010;
int b[N], a[N];

void insert(int l, int r, int c)//重点是这里
{
    b[l] += c;//1
    b[r + 1] -= c;//2
}//问题:这两行是什么意思呢
//答:在第一个insert的调用中这两行是构建差分数组
//因为第一步当i=1,a[1]代入式子1中,可得b1 = a1 + 0写成b1 = a1 - 0吧更好理解
//然后当i=2,a[2]代入,再结合第一步的2式和第二步的1式可得b2 = a2 - a1 ...等等
  //                                                   b3 = a3 -a2
    //                                                 ..
      //                                               bn = an -a(n -1);
        //                                 这样就推出了差分数组
//问题:为什么还要调用insert呢
//答:因为y总说过这是为了保证差分数组累加后形成的数组的部分区间整体加C
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i ++) insert(i, i, a[i]);
    while(m --)//重复m次操作
    {
        int l, r, c;
        scanf("%d%d%d", &l, &r, &c);
        insert(l, r, c);
    }
    //问题:为什么要循环for要写2次呢
    //答:第1个是将差分数组求和得到经历过m次操作的a[]数组的每一个元素
         // 第2个是输出差分数组累加完后得的值
    for(int i = 1; i <= n; i ++) b[i] += b[i - 1];//写成b[i] = b[i] +b[i-1]更好理解因为加完后再存到b[i]中
    for(int i = 1; i <= n; i ++) printf("%d ", b[i]);
    return 0;
}
//喜欢就给个关注呗

作者:A_B_C
链接:https://www.acwing.com/activity/content/code/content/7373452/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值