zoukankan      html  css  js  c++  java
  • 13.差分

     差分是前缀和的逆运算

    假如原数组是a[1],a[2],...,a[n].

    我们构造b数组,b[1],b[2],...,b[n].

    使得a[i] = b[1] + b[2] + ... + b[i]

    使得a数组是b数组的前缀和

    b数组就称为a数组的差分

    差分的作用:

    对b数组求一遍前缀和就可以得出a数组

    将b[l]加上c之后,从a[l],a[l + 1]一直到a[n]都会加上c

    再将b[r + 1]减去c

     然后就是初始化问题。

    开始时我们假定a数组全部都是0,那差分数组b也全部都是0

    然后我们看成是对a数组进行了n次插入操作

    也就是说,如果我们想把区间[l, r]整个加上一个数c的话,就让b[l] + c,b[r + 1] - c即可。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int N = 100010;
     4 int a[N], b[N];
     5 //a是原数组
     6 //b是差分数组 
     7 void insert(int l, int r, int c) { //在[l, r]之间加上c 
     8     b[l] += c;
     9     b[r + 1] -= c;
    10 }
    11 int main() {
    12     int n, m;
    13     cin >> n >> m;
    14     for (int i = 1; i <= n; i++) {
    15         cin >> a[i];
    16         insert(i, i, a[i]); //构造b数组 
    17     }
    18     while (m--) {
    19         int l, r, c;
    20         cin >> l >> r >> c;
    21         insert(l, r, c);
    22     }
    23     for (int i = 1; i <= n; i++) { //求所有操作后的数组,就是求一遍前缀和 
    24         b[i] += b[i - 1];
    25         cout << b[i] << " ";
    26     }
    27     return 0;
    28 }
  • 相关阅读:
    SqlServer查询优化方法
    关于导入excel问题
    修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法
    软件架构之我见
    算法-插入排序
    算法-快速排序
    WCF系列 Restful WCF
    WCF系列 基础概念
    cocos2dx-是男人就坚持20s 练手项目
    nodejs 聊天室简单实现
  • 原文地址:https://www.cnblogs.com/fx1998/p/12821785.html
Copyright © 2011-2022 走看看