AcWing 798. 差分矩阵——算法基础课题解

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,

1≤x1≤x2≤n,

1≤y1≤y2≤m,

−1000≤c≤1000,

−1000≤矩阵内元素的值≤1000

输入样例

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

输出样例

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

思路

差分矩阵的原理

假设有一个二维矩阵 mat,你需要对这个矩阵的某个子矩阵区域多次进行增加操作。直接更新会导致每次操作的时间复杂度和该子矩阵的大小成正比,当操作次数和矩阵大小都很大时,直接更新效率低下。

这时可以使用差分矩阵 diff 来优化。差分矩阵同样是二维的,其大小与原矩阵 mat 相同。差分矩阵的主要思想是记录变化(增量),而非直接改变矩阵 mat 的值。对差分矩阵的操作最终将被应用回原矩阵以反映所有的更新。

如何操作差分矩阵

  1. 初始化
    • 差分矩阵 diff 初始化时,所有值都为 0。
  2. 执行更新
    • 假设你要将子矩阵 (x1, y1)(x2, y2) 中的所有元素增加值 v
    • 更新 diff[x1][y1] 增加 v 表示从 (x1, y1) 开始,整个矩阵的元素都增加 v
    • 更新 diff[x1][y2+1] 减少 v 表示从 (x1, y2+1) 开始,右侧矩阵列元素恢复原值。
    • 更新 diff[x2+1][y1] 减少 v 表示从 (x2+1, y1) 开始,下方矩阵行元素恢复原值。
    • 更新 diff[x2+1][y2+1] 增加 v 表示从 (x2+1, y2+1) 开始,右下角的重叠部分再次增加 v,从而修正过度减少的部分。
  3. 构建最终矩阵
    • 通过累加 diff 矩阵的前缀和来构建最终矩阵 mat。这是通过对每一行和每一列分别累加来完成的,确保每个 mat[i][j] 反映了所有相关的 diff 更新。

C++

#include <iostream>using namespace std;const int N = 1010;int arr[N][N];void insert(int x1, int y1, int x2, int y2, int c) {arr[x1][y1] += c;arr[x2 + 1][y1] -= c;arr[x1][y2 + 1] -= c;arr[x2 + 1][y2 + 1] += c;
}int main() {int n, m, q, tmp;scanf("%d%d%d", &n, &m, &q);for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {scanf("%d", &tmp);insert(i, j, i, j, tmp);}}while (q--) {int x1, y1, x2, y2, c;scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c);insert(x1, y1, x2, y2, c);}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {arr[i][j] += arr[i][j - 1] + arr[i - 1][j] - arr[i - 1][j - 1];printf("%d ", arr[i][j]);}printf("\n");}return 0;
}
#include <iostream>using namespace std;const int N = 1010;int n, m, q;
int a[N][N], b[N][N];void insert(int x1, int y1, int x2, int y2, int c) {b[x1][y1] += c;b[x2 + 1][y1] -= c;b[x1][y2 + 1] -= c;b[x2 + 1][y2 + 1] += c;
}int main() {scanf("%d%d%d", &n, &m, &q);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)scanf("%d", &a[i][j]);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)insert(i, j, i, j, a[i][j]);while (q--) {int x1, y1, x2, y2, c;cin >> x1 >> y1 >> x2 >> y2 >> c;insert(x1, y1, x2, y2, c);}for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) printf("%d ", b[i][j]);puts("");}return 0;
}

Go

package mainimport ("bufio""fmt""os"
)func insert(arr [][]int, x1, y1, x2, y2, c int) {arr[x1][y1] += carr[x1][y2+1] -= carr[x2+1][y1] -= carr[x2+1][y2+1] += c
}func main() {var n, m, q, tmp intreader := bufio.NewReader(os.Stdin)fmt.Fscan(reader, &n, &m, &q)arr := make([][]int, n+2)for i := 0; i <= n+1; i++ {arr[i] = make([]int, m+2)}for i := 1; i <= n; i++ {for j := 1; j <= m; j++ {fmt.Fscan(reader, &tmp)insert(arr, i, j, i, j, tmp)}}for i := 1; i <= q; i++ {var x1, y1, x2, y2, c intfmt.Fscan(reader, &x1, &y1, &x2, &y2, &c)insert(arr, x1, y1, x2, y2, c)}writer := bufio.NewWriter(os.Stdout)defer writer.Flush()for i := 1; i <= n; i++ {for j := 1; j <= m; j++ {arr[i][j] += arr[i][j-1] + arr[i-1][j] - arr[i-1][j-1]fmt.Fprint(writer, arr[i][j], " ")}fmt.Fprintln(writer)}
}

模板

给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:
S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL数据库高级sql总结2

1、postgresql 数据库update 去重sql 先按重复记录fk分组找最小的记录&#xff0c;然后更新id 不在子查询中的数据 update td_f_stop_history set del_flag1 where "id" not in (select "min"("id") from td_f_stop_history where allowed_re…

香港裸机云多IP服务器都有哪些配置?

香港裸机云多IP服务器是一种高效、灵活的云计算服务&#xff0c;为用户提供了多IP地址的配置选项&#xff0c;以满足各种复杂的网络需求。这种服务器在配置上具有丰富的多样性和高度的可定制性&#xff0c;下面我们就来科普一下香港裸机云多IP服务器的主要配置。 首先&#xff…

开源模型应用落地-chatglm3-6b-模型输出违禁词检测(九)

一、前言 受限于模型本身的一些缺陷&#xff0c;任何模型均可能会生成一些不正确的输出。如何通过技术的手段去规避模型潜在的风险&#xff0c;提升推理质量是需要持续探究的过程。 如何利用第三方内容安全审核服务去检测模型输出内容的合规性&#xff0c;请查看&#xff1a;开…

【资源分享】Stata 17免费下载安装

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

LabVIEW仪器信息管理系统

LabVIEW仪器信息管理系统 在计量检测实验室的日常工作中&#xff0c;仪器检定校准是一项基础而重要的任务。随着科技的进步和实验室工作量的增加&#xff0c;传统的人工管理方式已经难以满足现代实验室对效率和准确性的要求。开发一套基于LabVIEW的仪器信息管理系统显得尤为必…

利用AOP数据脱敏

背景 要求对接口中含有的电话、身份证、名字进行脱敏处理显示部分数据&#xff0c;并对老的接口同步改造&#xff0c;由于改动部分较多。想到了利用自定义注解配合切面处理&#xff0c;减少对原本接口的改动。 注意&#xff1a;注解及切面只针对String类型的属性有效 注解定…

魔方网表ERP mailupdate.jsp 任意文件上传漏洞复现

0x01 产品简介 魔方网表ERP是一款高效、灵活的企业资源规划解决方案,旨在帮助企业实现数智化转型,消除信息孤岛,打造全程一体化的管理体系。魔方网表ERP拥有强大的表单功能和模块化的产品特点,使得企业可以根据自身业务需求,通过简单的拖拽和配置,快速搭建符合自身特点的…

python爬豆瓣top250电影

文章目录 前言分析与实现1.对豆瓣网网站进行Ajax分析2.发送请求3.进一步筛选&#xff08;提取&#xff09; 完整代码 前言 通过这个项目&#xff0c;可以让小白对爬虫有一个初步认识&#xff0c;爬取豆瓣top250是一个初学者学爬虫的必经之路&#xff0c;话不多说&#xff0c;我…

解决AGP升级到8.0后编译报错kaptGenerateStubsDebugKotlin

问题描述 升级了Gradle插件到8.0&#xff0c;运行报以下错误. Execution failed for task :app:kaptGenerateStubsDebugKotlin. > compileDebugJavaWithJavac task (current target is 1.8) and kaptGenerateStubsDebugKotlin task (current target is 17) jvm target com…

每日算法4/17

1552. 两球之间的磁力 题目 在代号为 C-137 的地球上&#xff0c;Rick 发现如果他将两个球放在他新发明的篮子里&#xff0c;它们之间会形成特殊形式的磁力。Rick 有 n 个空的篮子&#xff0c;第 i 个篮子的位置在 position[i] &#xff0c;Morty 想把 m 个球放到这些篮子里&…

【面试经典 150 | 链表】分隔链表

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;模拟 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

Springboot集成JWT token实现权限验证

紧接着上一次的博客&#xff0c;我们现在来给这个项目添加一个jwt的权限验证功能&#xff0c;上一次的博客如下&#xff1a;springboot结合vue实现登录和注册功能-CSDN博客 1.后端 1.1.导入依赖 <dependency><groupId>com.auth0</groupId><artifactId&g…

Redis: 事务操作

文章目录 一、Redis的事务定义二、Redis事务的操作方式三、Redis事务三特性四、事务冲突问题五、使用场景 一、Redis的事务定义 Redis事务是一组命令的集合&#xff0c;这些命令会作为一个单独的执行单位进行执行。在执行事务期间&#xff0c;其他客户端发送的命令不能被插入到…

长页面多模块调接口优化

背景&#xff1a; 查询近3年数据之类的&#xff0c;接口就会有大量数据需要查询做聚合&#xff0c;因此接口响应较慢。同时前端页面有大量不同维度展示的图表&#xff0c;渲染阻塞时间过长&#xff0c;用户体验较差&#xff0c;长时间loading&#xff0c;导致无法交互。因此前…

2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统(一)

01 D题实现效果演示 视频参考微信原文&#xff1a;2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统&#xff08;一&#xff09; 02 D题任务要求 &#xff08;D题原文件参见本文附录&#xff09; 设计并制作一个图中所示的基于互联网的摄像测量系统。图中边长…

【Python】异常处理结构

文章目录 1.python异常2.try_except异常处理结构3.try... 多个except异常处理4.try_except_else异常处理结构5.try_except_finally异常处理结构6.常见报错类型 在运行代码时&#xff0c;总是遇到各种异常&#xff0c;且出现异常时&#xff0c;脚本就会自动的的停止运行&#xf…

时序分析基本知识点

【FPGA开发/IC开发之时序约束最全面的归纳总结】时序路径基本概念及时序约束分析方法_时序约束指令-CSDN博客

就业班 第三阶段(nginx) 2401--4.17 day1 nginx1

负载均衡集群 1、集群是什么&#xff1f; 1 集群&#xff08;cluster&#xff09;技术是一种较新的技术&#xff0c;通过集群技术&#xff0c;可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益&#xff0c;其任务调度则是集群系统中的核心技术。 …

频率分辨率

频率分辨率是描述频谱分析能力的一个重要指标。它指的是频谱分析仪在频率轴上的最小可区分的频率间隔。 更具体地说: 频率分辨率描述了频谱分析中能够分辨出的最小频率差。例如,如果频率分辨率为1 Hz,就意味着该分析仪能够将相隔1 Hz的两个频率成分区分开来。 频率分辨率受到…

FinalShell 远程连接 Linux(Ubuntu)系统

Linux 系列教程&#xff1a; VMware 安装配置 Ubuntu&#xff08;最新版、超详细&#xff09;FinalShell 远程连接 Linux&#xff08;Ubuntu&#xff09;系统Ubuntu 系统安装 VS Code 并配置 C 环境 ➡️➡️➡️提出一个问题&#xff1a;为什么使用 FinalShell 连接&#xff0…