图文详解二维差分

这篇具有很好参考价值的文章主要介绍了图文详解二维差分。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、 二维差分的定义

二、二维差分的使用

三、计算二维差分

四、ACWing 798. 差分矩阵



前言

一维+二维前缀和详解

图文详解一维差分

一、 二维差分的定义

对于一个给定的二维数组 arr,它的二维差分数组 d 中 d[i][j] 可以用如下公式计算

② 

③ 

二维差分,算法,算法

实际上,上面的公式是通过二维数组 arr 是二维差分数组的前缀和这个条件推导出来的,因此,不像一维差分定义那样直观。

二、二维差分的使用

二维差分的主要用处:快速地将一个区块中的所有元素都加上一个值 v

使用差分可以将在数组 arr 上的区块操作转化为在差分数组 d 上的单点操作。转换方式如下

假设区块左上角坐标为 (x1, y1),右下角坐标为 (x2, y2),对该区块中的每个元素都加上 v 等价于下面四个操作:

1.二维差分,算法,算法

二维差分,算法,算法

2.二维差分,算法,算法

二维差分,算法,算法 

 3.二维差分,算法,算法

二维差分,算法,算法

4.二维差分,算法,算法

二维差分,算法,算法 因为差分数组的前缀和相当于原数组,所以对差分数组进行以上四个单点操作后,就相当于给数组 arr 的区块加上一个值 v。

三、计算二维差分

通过定义计算二维差分比较复杂,可以使用一种更巧妙的方法:将二维差分中的每个元素一个一个地插进去

  1. 首先假设原二维数组 arr 的元素全为 0,那么二维差分数组 d 的元素显然也全为 0,这样完全符合定义。

  2. 接下来将 arr 中的每个元素依次更新为实际值。例如 arr[2][3] 的实际值为 5,那么就相当于给以 (2, 3) 坐标为左上角,(2, 3) 坐标为右下角的区块中的所有元素加上 5

    ① d[2][3] += 5

    ② d[3][3] -= 5

    ③ d[2][4] -= 5

    ④ d[3][4] += 5

    这样便得到了整个差分数组。

四、ACWing 798. 差分矩阵

题目描述

输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1, y1, x2, y2, c,其中 (x1, y1) 和 (x2, y2) 表示一个子矩阵的左上角坐标和右下角坐标。

每个操作都要将选中的子矩阵中的每个元素的值加上 c。

请你将进行完所有操作后的矩阵输出。

输入格式

第一行包含整数 n, m, q。

接下来 n 行,每行包含 m 个整数,表示整数矩阵。

接下来 q 行,每行包含 5 个整数 x1, y1, x2, y2, c,表示一个操作。

输出格式

共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。

数据范围

1 ≤ n, m ≤1000, 1 ≤ q ≤100000, 0 ≤ x1 ≤ x2 ≤ n - 1, 0 ≤ y1 ≤ y2 ≤ m - 1, −1000 ≤ c ≤ 1000, −1000 ≤ 矩阵内元素的值 ≤ 1000

输入样例

3 4 3
1 2 2 1
3 2 2 1
1 1 1 1
0 0 1 1 1
0 2 1 2 2
2 0 2 3 1

输出样例

2 3 4 1
4 3 4 1
2 2 2 2

代码实现: 文章来源地址https://www.toymoban.com/news/detail-629661.html

#include <stdio.h>

int arr[1000][1000];  
int d[1001][1001];

void insert(int x1, int y1, int x2, int y2, int c)
{
	d[x1][y1] += c;
	d[x2 + 1][y1] -= c;
	d[x1][y2 + 1] -= c;
	d[x2 + 1][y2 + 1] += c;
}

int main()
{
	int n = 0, m = 0, q = 0;
	scanf("%d %d %d", &n, &m, &q);
	int i = 0;
	int j = 0;
	// 输入整数矩阵,并计算二维差分
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);
			insert(i, j, i, j, arr[i][j]);
		}
	}
	// 进行 q 次操作
	while (q--)
	{
		int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
		int c = 0;
		scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &c);
		insert(x1, y1, x2, y2, c);
	}	
	// 计算二维差分的前缀和,即原二维数组 arr
	arr[0][0] = d[0][0];
	for (j = 1; j < m; j++)
	{
		arr[0][j] = arr[0][j - 1] + d[0][j];
	}
	for (i = 1; i < n; i++)
	{
		arr[i][0] = arr[i - 1][0] + d[i][0];
	}
	for (i = 1; i < n; i++)
	{
		for (j = 1; j < m; j++)
		{
			arr[i][j] = arr[i - 1][j] + arr[i][j - 1] - arr[i - 1][j - 1] + d[i][j];
		}
	}
	// 输出
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

到了这里,关于图文详解二维差分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 二维差分 二维前缀和逆运算 差分矩阵

    输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c ,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上 c 。 请你将进行完所有操作后的矩阵输出。 输入格式 第一行包含整数

    2024年02月21日
    浏览(55)
  • 机器学习中四类进化算法的详解(遗传算法、差分进化算法、协同进化算法、分布估计算法)

    GA算法原理 首先我们来介绍进化算法的先驱遗传算法,遗传算法(Genetic Algorithm,简称GA)是一种最基本的进化算法,它是模拟达尔文生物进化理论的一种优化模型,最早由J.Holland教授于1975年提出。遗传算法中种群分每个个体都是解空间上的一个可行解,通过模拟生物的进化

    2024年02月09日
    浏览(44)
  • 洛谷 P3397 地毯 刷题笔记 二维差分矩阵

    P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 方法1 欺负数据小  暴力水过 #includeiostream using namespace std; const int N=1010; int a[N][N]; int main(){     int n,m;     cinnm;     for(int i=0;im;i++){         int x1,y1,x2,y2;         cinx1y1x2y2;         for(int q=x1;q=x2;q++){           

    2024年02月03日
    浏览(72)
  • 二维前缀和&二维差分(超详细,python版,其他语言也很轻松能看懂)

    上一篇文章讲解了一维前缀和一维差分,本篇进阶为二维。 二维前缀和跟一维前缀和求法相同,这里直接上例子。 数组a = [[1,2,2,1],[3,2,2,1],[1,1,1,1]] a数组如图: 则数组a的前缀和为:数组b[[1,3,5,6],[4,8,12,14],[5,10,15,18]] b数组如图: 前缀和递推公式为 b[i][j] = b[i - 1][j] + b[i][j - 1]

    2024年04月22日
    浏览(41)
  • 正演(1): 二维声波正演模拟程序(中心差分)Python实现

    目录 1、原理:  1)二维声波波动方程: ​编辑 2)收敛条件(不是很明白) 3)雷克子波 4)二维空间衰减函数  5)边界吸收条件 (不是很明白。。)  2、编程实现 1)参数设置: 2)雷克子波及二维空间衰减函数 3)边界吸收条件 4)波动方程,迭代公式: 5)全部代码如下:

    2024年02月02日
    浏览(44)
  • 【algorithm】认真讲解前缀和与差分 (图文搭配)

    🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 📣系列专栏:AcWing算法笔记 今天的月色好美 这里介绍以下前缀和算法以及差分算法,用来梳理自己所学到的算法知识。 从我的理解角度来讲:前缀和就是高中数学当中的数列的求和Sn,差分就是前缀和的逆运算,就是

    2024年01月21日
    浏览(41)
  • 【算法详解】力扣240.搜索二维矩阵II

    力扣链接:力扣240.搜索二维矩阵II 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 题目提到该矩阵是从左到右,从上到下递增的,那么我们就要利用这个性质,从矩阵

    2024年01月21日
    浏览(46)
  • A*算法图文详解

    A*算法最早于1964年在IEEE Transactions on Systems Science and Cybernetics中的论文《A Formal Basis for the Heuristic Determination of Minimum Cost Paths》中首次提出。其属于一种经典的启发式搜索方法,所谓启发式搜索,就在于当前搜索结点往下选择下一步结点时,可以通过一个启发函数来进行选择,

    2024年02月03日
    浏览(35)
  • 排序算法——希尔排序图文详解

    注1:本篇是基于对直接插入排序法的拓展,如果对直接插入法不了解,建议先看看 直接插入排序 注2:本篇统一采用升序排序 希尔排序法又称缩小增量法。 希尔排序其实是直接插入排序的改进。 其 基本思想是 : 先选定一个整数gap,把待排序文件中所有记录分成数组,所有

    2024年02月07日
    浏览(38)
  • manacher——马拉车算法(图文详解)

     马拉车算法,Manacher‘s Algorithm 是用来查找一个字符串的 最长回文子串 的线性方法,是一个叫 Manacher的人在1975年发明 的,这个方法的最大贡献是在于将时 间复杂度提升到了线性O(N) 。 刷题——最长回文子串,回文子字符串的个数。 生物中的基因排列可能会用到,DNA/RNA遗

    2024年02月08日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包