• 1.3 前缀与差分


    1. 前缀和

    1. 一维数组前缀和

    对于一个给定的序列A,它的前缀和数列S是通过递推能够求出的基本信息之一:

    $S[i] = sum_{x=1}^i A[x]$

    一个部分和,即数列A某个下标区间内的数的和,可表示为前缀和相减的形式:

    $sum(l,r) = sum_{x=l}^r A[x] = S[r] - S[l-1]$

    2. 二维数组前缀和

    类似的我们可以表示出二位前缀和

      $sum(1, 1, i, j)$

    $= sum_{x=1}^i sum_{y=1}^j A[x][y]$

    $= sum_{x=1}^{i-1} sum_{y = 1}^{j} A[x][y] + sum_{x=1}^{i} sum_{y = 1}^{j-1} A[x][y] - sum_{x=1}^{i-1} sum_{y = 1}^{j-1} A[x][y] + A[i][j]$

    $= sum(1, 1, i-1, j) + sum(1, 1, i, j-1) - sum(1, 1, i-1, j-1) + A[i][j]$

    一个部分和,几数列二维数列A某个区间的和(x1, y1, x2, y2),可以表示为前缀和相减的形式:

      $sum(x1, y1, x2, y2)$

    $= sum_{x=x1}^{x2} sum_{y=y1}^{y2} A[x][y]$

    $= sum_{x=1}^{x2} + sum_{y=1}^{y2} A[x][y] - sum_{x=1}^{x2} + sum_{y=1}^{y1-1} A[x][y] - sum_{x=1}^{x1-1} sum_{y=1}^{y2} A[x][y] + sum_{x=1}^{x1-1} sum_{y=1}^{y1-1} A[x][y]$

    $= sum(1, 1, x2, y2) - sum(1,1, x2, y1-1) - sum(1,1, x1-1, y2) + sum(1,1, x1-1, y1-1) $

    2. 差分

    1. 一维差分

    对于一个给定的数列A,它的差分数列B定义为:

    $B[1]=A[1], B[i] = A[i]-A[i-1] (2leq i leq n)$

    容易发现前缀和和差分是一对互逆运算,差分序列B的前缀和序列就是原序列A,前缀和序列S的差分序列就是A。

    把序列A的区间[l, r]加d(即把$A_l, A_{i+1}, A_{i+2},...,A_r$都加上d),其差分序列B的变化为$B_l$加上d,$B_{r+1}$减去d,其他位置不变,这有助于我们很多题目中,把原序列上的“区间操作”转化为差分序列上的“单点操作”进行计算,降低求解难度。

    3. 相关练习

    1.激光炸弹

    2.IncDec Sequence

    3.Tallest Cow

  • 相关阅读:
    maven项目的构建命令
    linux的find命令
    python函数中参数前面的*和**的含义
    python中字典和集合的使用
    python中列表和元组的基本操作
    在Python中写中文注释格式
    linux 文件操作基本命令
    linux脚本实现递归阶乘
    base64
    从DispatcherServlet中的doService了解spring组件之间的处理流程
  • 原文地址:https://www.cnblogs.com/hebust-fengyu/p/11649100.html
Copyright © 2020-2023  润新知