当前位置: 首页 > news >正文

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

在这里插入图片描述

文章目录

  • 一.二维差分
    • 构造差分二维数组
    • 二维差分算法
    • 状态dp求b[i][j]数组的二维前缀和图解
  • 二.三维前缀和与差分
    • 三维前缀和图解:
    • 三维差分核心公式图解:
    • 模板题

一.二维差分

  • 给定一个原二维数组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;
}
//状态递推法对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]);}}
}
  • 求出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];}}}
}

三维差分核心公式图解:

在这里插入图片描述

  • "相邻点"的加减满足容斥关系,相邻互斥,相间相容
  • 核心公式接口:
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

在这里插入图片描述

http://www.lryc.cn/news/300058.html

相关文章:

  • D. Divisible Pairs
  • 【教程】Kotlin语言学习笔记(二)——数据类型(持续更新)
  • react 插槽
  • Linux运用fork函数创建进程
  • Pytest测试技巧之Fixture:模块化管理测试数据
  • 设计模式-职责链模式Chain of Responsibility
  • 书生浦语大模型实战营-课程作业(3)
  • 考研英语单词25
  • 计算机网络——08应用层原理
  • 面试计算机网络框架八股文十问十答第五期
  • 拟合案例1:matlab积分函数拟合详细步骤及源码
  • 嵌入式软件设计入门:从零开始学习嵌入式软件设计
  • Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)
  • 微信小程序介绍、账号申请、开发者工具目录结构详解及小程序配置
  • 数字的魅力之情有独钟的素数
  • Vue2源码梳理:render函数的实现
  • flask+python企业产品订单管理系统938re
  • Vue2源码梳理:关于数据驱动,与new Vue时的初始化操作
  • 【C++航海王:追寻罗杰的编程之路】关于模板,你知道哪些?
  • 分布式springboot 3项目集成mybatis官方生成器开发记录
  • 算法学习——LeetCode力扣回溯篇4
  • c++ STL系列——(六)multimap
  • Json-序列化字符串时间格式问题
  • HarmonyOS鸿蒙学习基础篇 - 自定义组件(一)
  • 开窗,挖槽,放电齿,拼版
  • [Vue的组件通讯.sync修饰]Vue中.sync的使用方法和实现的方式 代码注释
  • Java 基于springboot+vue在线外卖点餐系统,附源码
  • Decian 12.x基于LNMP安装phpIPAM(IP管理系统)
  • 【多模态MLLMs+图像编辑】MGIE:苹果开源基于指令和大语言模型的图片编辑神器(24.02.03开源)
  • hpp文件:C++开发中的利器