【算法通关指南:算法基础篇(四)】二维差分专题:1.【模板】差分 2.地毯

🔥小龙报:个人主页

🎬作者简介:C++研发,嵌入式,机器人方向学习者

❄️个人专栏:《算法通关指南》
永远相信美好的事情即将发生

文章目录


前言

本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力
ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长


一、二维差分

可以类比「⼀维差分数组」的性质,推导出「⼆维差分矩阵」的性质:

• 在差分数组中某个位置标记:表示后续元素统⼀被修改;

• 在差分数组中求前缀和:能够还原出原始数组。

假设我们需要将原始矩阵a中,以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的每个元素都加上k

结论

由此可得差分矩阵的性质:
fx1 y1 + = k
fx1 y2 + 1− = k
fx2 + 1y1 − = k
fx2 + 1y2 + 1+ = k

二、二维差分经典算法题

2.1【模板】差分

2.1.1题目

链接:【模板】差分

2.1.2 算法原理

依照刚才讲解二维差分原理模拟即可

2.2.3代码

c 复制代码
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1100;
LL f[N][N];

void cacl(LL x1, LL y1, LL x2, LL y2,LL k)
{
	f[x1][y1] += k;
	f[x1][y2 + 1] -= k;
	f[x2 + 1][y1] -= k;
	f[x2 + 1][y2 + 1] += k;
}

int main()
{
	int n, m, q;
	cin >> n >> m >> q;

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			LL x;
			cin >> x;
			// [i, j]为左上⻆,[i, j]为右下⻆的矩阵,统⼀加上 x 
			cacl(i, j, i, j, x);
		}
	}

	while (q--)
	{
		LL x1, y1, x2, y2,k;
		cin >> x1 >> y1 >> x2 >> y2 >> k;

		cacl(x1, y1,x2, y2, k);
	}

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
			f[i][j] += f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1];
	}


	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
			cout << f[i][j] << " ";
		cout << endl;
	}

	return 0;
}

2.2 地毯

2.2.1题目

链接:地毯

2.2.2 算法原理

直接利⽤二维差分矩阵模拟即可

2.2.3代码

c 复制代码
#include <iostream>
using namespace std;
const int N = 1010;
int a[N][N];  // 差分矩阵 

void cacl(int x1, int y1, int x2, int y2)
{
	a[x1][y1]++;
	a[x1][y2 + 1]--;
	a[x2 + 1][y1]--;
	a[x2 + 1][y2 + 1]++;
}

int main()
{
	int n, m;
	cin >> n >> m;

	while (m--)
	{
		int x1, y1, x2, y2;
		cin >> x1 >> y1 >> x2 >> y2;

		cacl(x1, y1, x2, y2);
	}

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
			a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
	}
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
			cout << a[i][j] << " ";
		cout << endl;
	}
	return 0;
}

总结与每日励志

本文介绍了二维差分算法的原理和应用。二维差分通过在特定位置标记增量,可以高效处理子矩阵元素的批量修改。文章通过两道经典算法题(模板差分和地毯问题)展示了二维差分的实现方法,提供了完整的代码示例。核心思想是利用差分矩阵的性质,通过前缀和还原原始数组。算法简洁高效,适用于大规模矩阵操作。作者鼓励读者坚持学习,相信付出终有回报。

相关推荐
Gigavision1 小时前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
鹿角片ljp2 小时前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
aramae2 小时前
模拟实现strcmp()(C语言)
c语言·开发语言·后端
计算机编程-吉哥3 小时前
YOLO26 vs YOLO11 vs YOLOv8:深度学习咖啡果实成熟度分割系统【计算机毕业设计选题推荐】
人工智能·python·深度学习·yolo·django·毕业设计
彧azz3 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外4 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55234 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
汉克老师5 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood5 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz6 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva