当前位置:   article > 正文

二维差分---三维差分算法笔记_三维差分法

三维差分法

在这里插入图片描述

一.二维差分

  • 给定一个原二维数组a[i][j],若要给a[i][j]中以(x1,y1)(x2,y2)为对角线的子矩阵中每个数都加上一个常数c,暴力的做法时间复杂度为O(N^2),使用二维差分可以在O(1)的时间复杂度内完成该操作
    在这里插入图片描述

构造差分二维数组

  • 构造差分二维数组b[i][j]使得原二维数组a[i][j]是二维数组b[i][j]的二维前缀和数组,即满足:
    在这里插入图片描述
    在这里插入图片描述

二维差分算法

  • 若使原数组a[i][j]中以(x1,y1)(x2,y2)为对角线的子矩阵中每个数都加上一个常数c,等价于对b[i][j]数组进行如下操作:
    • b[x1][y1] += c
    • b[x2+1][y2+1] += c
    • b[x2+1][y1] -= c
    • b[x1][y2+1] -= c
  • 核心操作接口:
//使原数组a[i][j]中以(x1,y1)和(x2,y2)为对角线的子矩阵中每个数都加上一个常数c
//接口可以用于构造差分矩阵以及进行原数组的矩阵元素整体修改操作
void Matrix_Add(long long(*b)[1010],int x1 ,int y1,int x2 ,int y2,int c){
    b[x1][y1] += c;
    b[x2+1][y2+1] += c;
    b[x1][y2+1] -= c;
    b[x2+1][y1] -= c;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
//状态递推法对b[i][j]数组求二维前缀和,以获取原数组的元素--> 默认矩阵第0行第0列全部元素为0
void Get_Pre_Sum(long long(*b)[1010],int row , int col){
    //求(1,1)~(i,j)的子矩阵的和
    for(int i = 1 ; i <= row ; ++i){
        for(int j = 1 ; j<=col ; ++j){
            b[i][j] += (b[i-1][j] + b[i][j-1] - b[i-1][j-1]);
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 求出b[i][j]数组的二维前缀和就可以恢复原数组a[i][j]

状态dp求b[i][j]数组的二维前缀和图解

在这里插入图片描述

二.三维前缀和与差分

三维前缀和图解:

在这里插入图片描述

  • 前缀和递推构造接口:
void Get_Pre_Sum(vector<vector<vector<long long>>>& Board,int high,int row,int col ){
    for(int i = 1 ; i <= high ; ++i){
        for(int j = 1 ;  j <= row ; ++j){
            for(int k = 1 ; k <= col ; ++k){
                Board[i][j][k] += Board[i-1][j][k] + Board[i][j-1][k] - Board[i-1][j-1][k] +
                                  Board[i][j][k-1] - Board[i-1][j][k-1] - Board[i][j-1][k-1] + Board[i-1][j-1][k-1];
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

三维差分核心公式图解:

在这里插入图片描述

  • "相邻点"的加减满足容斥关系,相邻互斥,相间相容
  • 核心公式接口:
void Matrix_Add(vector<vector<vector<long long>>>& Board,int x1 , int y1 , int z1 , int x2 , int y2 , int z2 , int c){
    Board[x1][y1][z1] += c;
    Board[x1][y2+1][z1] -= c;
    Board[x2+1][y1][z1] -= c;
    Board[x2+1][y2+1][z1] += c;
    Board[x1][y1][z2+1] -= c;
    Board[x1][y2+1][z2+1] += c;
    Board[x2+1][y1][z2+1] += c;
    Board[x2+1][y2+1][z2+1] -= c;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

模板题

差分模板题1
差分模板题2

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/500912
推荐阅读
相关标签
  

闽ICP备14008679号