• 信息学中的差分


    差分

    差分是一种和前缀和有关的算法

    我们来看看差分的定义

    令a数组为:1 2 3 1 2 3
    那么差分数组b为: 1 1 1 -2 1 1
    令a[0] = 0
    那么b[i] = a[i] - a[i - 1]


    算法解析:

    现在要更新数组a的(x1~x2)位:将其增加k
    我们可以将b[x1]增加k, 并且将b[x2 + 1]减少k
    为什么呢,现在来证明一下算法的正确性:
    不妨设n = 10, x1 = 3, x2 = 6
    (ecauseDelta a[3] = Delta a[4] = Delta a[5] = Delta a[6] = k)
    ( hereforeDelta b[4] = Delta b[5] = Delta b[6] = 0)
    (ecause[3,6])这段区间中所有的数都增加了k
    ( hereforeDelta (a[3] - a[2]) = k, Delta (a[7] - a[6]) = -k)
    (Delta b[3] = k, Delta b[7] = -k)


    代码示例:

    a[0] = 0;
    for(int i = 1; i <= n; i ++) a[i] = read();
    for(int i = 1; i <= n; i ++) b[i] = a[i] - a[i - 1];
    for(int i = 1; i <= m; i ++) {
          int x1 = read(), x2 = read(), k = read();
          b[x1] += k, b[x2 + 1] -= k;
    }
    for(int i = 1; i <= n; i ++)
          b[i] += b[i - 1];
    for(int i = 1; i <= n; i ++)
          cout << b[i] << ' ';
    

    Input:

    5 5
    1 2 3 4 5
    1 3 5
    2 2 4
    3 5 8
    2 3 1
    3 4 2
    

    Output:

    6 12 19 14 13
    

    口算:

    1. 6 7 8 4 5
    2. 6 11 8 4 5
    3. 6 11 16 12 13
    4. 6 12 17 12 13
    5. 6 12 19 14 13
      完全正确,可见算法正确性
      (看我打那么辛苦就点个赞吧)
  • 相关阅读:
    android 单位详解
    ViewFlipper的使用
    today is history,today is tomorrow
    Android2.1 和之后的版本 中的 drawable(hdpi,ldpi,mdpi) 的区别
    auto_ptr
    android编写Service入门
    Android程序完全退出的三种方法
    Android中Toast的用法简介
    安装android开发环境
    error C2850: 'PCH header file'
  • 原文地址:https://www.cnblogs.com/Wuzhuoming-sirenboke/p/13616246.html
Copyright © 2020-2023  润新知