Skip to content

二维差分

字数
391 字
阅读时间
2 分钟
  • 假设存在 n×n 的矩阵,则:
    • 原数组为:a[N][N]
    • 其差分数组为:f[i][j]=a[i][j]a[i1][j]a[i][j1]+a[i1][j1]
    • 得到原数组的方式:
      • f[i][j]+=f[i1][j]+f[i][j1]f[i1][j1]

公式计算(在树状数组中的应用)

假设存在二维差分数组,那么要求其前缀和,就要通过二维计算,但在数据量大时,无法通过两次前缀和得到结果,会超时,所以需要维护两个树状数组。计算过程如下: bk=i=1kj=1ibj=i=1kbj(kj+1)=(k+1)i=1kbji=1kbjj 因为j=1ibj 的第一项 b1 会被取 k 次,第二项 b2 会被取 k - 1 次,所以总结规律即可得出结论:i=1kbj(kj+1)

应用

  • 一图示:
  • 说明:
    • 在我们要的区间开始位置(x1,y1)处 +c,根据前缀和的性质,那么它影响的就是整个黄色部分,多影响了两个蓝色部分,所以在两个蓝色部分 -c 消除 +c 的影响,而两个蓝色部分重叠的绿色部分多了个 -c 的影响,所以绿色部分 +c 消除影响。所以对应的计算方法如下:
diff[x1][y1] += c;
diff[x1][y2+1] -=c;
diff[x2+1][y1] -=c;
diff[x2+1][y2+1] += c;

贡献者

The avatar of contributor named as freeway348 freeway348

文件历史

撰写