zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    CF1070F Debate
    P3502 [POI2010]CHO-Hamsters
    CF1421A XORwice
    P2073 送花
    树链剖分边权转化为点权
    球——数学分析,模型构建
    数位dp的模版
    不要62
    智慧题——规律题
    CF551C GukiZ hates Boxes——模拟加二分
  • 原文地址:https://www.cnblogs.com/hebust-fengyu/p/11649100.html
Copyright © 2011-2022 走看看