二维差分【算法推导,图文讲解清晰】

news2024/10/6 4:02:03

798. 差分矩阵 - AcWing题库

算法推导

二维差分相对一维差分会复杂一点,而且还要结合二维前缀和的一些细节处理

A、B数组角色问题

在差分思想中,构造并不是那么重要,而是其中A、B数组的角色。

我们假想存在一个数组B,输入的A数组是B数组的前缀和——差分思想核心

也就是说:我们对B[i][j] 添加一个数后,从A[i][j]开始一直到A[n][n]都将 添加一个数

所以,这样就很巧妙的将 需要循环处理的,转化成了对B数组的某一个的处理(好好理解这句话!!!看懂这个你就看懂了差分的核心思想

当然,可能还有一点比较奇怪的是:那怎么解释开始时和输入后的数组呢?

开始时,前缀和数组A(输入的)和B数组都是空的,也都是0,此时是满足前缀和概念的

然后当我们开始往A数组写入数据时,此时B数组是空的,那么此时就A数组好像就并不是B数组的前缀和了!

所以,此时我们需要向B数组对应位置也插入相应的值,只是需要处理的坐标都是i , j

这样就满足了A是B的前缀和的概念了

处理B数组的值

因为A数组是B数组的前缀和,所以当我们对B[i][j]加上某一个常数c后,A数组从[ i, j ]后面都加上了c

具体来说,当i = 2 , j = 1时加上一个常数时,后面(红色框起来的)都加上了一个常数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UDvq53ga-1681650526119)(assets/image-20230416204519-w7btoet.png)]

然而题目所要求的的是,我们在[ x1 , y1 ][ x2 , y2 ]范围加上一个常数c即可,所以我们就需要像二维前缀和数组一样减去某些位置的值

假设,我们只需要计算[2 , 1][3 , 3]的数据

也就是只需要对红色框加上常数即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dk9i4ZsM-1681650526120)(assets/image-20230416204710-wvoiqrg.png)]

当我们对a[2][1]加上常数c后,从[2 , 1][4 , 4]都加上了c,我们需要减去对应的值即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dL4IBZDz-1681650526120)(assets/image-20230416205233-2e3zzpq.png)]

从图中我们不难看出,我们需要进行

  • a[3 , 1] -= c
  • a[2 , 3] -= c

但是这里我们会发现会减去两次,所以我们需要对a[3 , 3] += c

抽象总结

  • a[2][1] += c
  • a[3][1] -= c
  • a[2][3] -= c
  • a[3][3] += c

这里对应的(x1,y1)和(x2,y2)分别是(2,1)和(3,3)

所以抽象一下,我们就能得到这样一个核心插入逻辑

  • b[x1][y1] += c;
  • b[x2 + 1][y1] -= c;
  • b[x1][y2 + 1] -= c;
  • b[x2 + 1][y2 + 1] += c;

结果输出

因为前面我们对于A数组的设计是B数组的前缀和,但是在前面的相关逻辑处理中,我们并没有体现,所以我们需要在结果计算中体现

这里就与前缀和的处理逻辑一样了

            b[i][j] += b[i-1][j] + b[i][j - 1] - b[i - 1][j - 1];

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ASdR8fIR-1681650526120)(assets/image-20230416210541-fs2ydlv.png)]

假设,当前我们需要计算[2 , 2]时,我们就需要加上左边和上边的值

但是因为左上角的那个值会被加两次,所以这里就要 加上一个c

代码模板

#include<iostream>

using namespace std;

int n , m , q;

const int N = 1008;

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]);
            insert(i , j , i , j , a[i][j]);
        }
    }
  
    int x1 , y1 , x2 ,y2 , c;
    while(q --){
        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 ++){
            b[i][j] += b[i-1][j] + b[i][j - 1] - b[i - 1][j - 1];
            cout << b[i][j] << " ";
        }
        cout << endl;
    }
  
    return 0 ;
}

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

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

相关文章

论文阅读《NeRF-Supervised Deep Stereo》

论文地址&#xff1a;https://arxiv.org/pdf/2303.17603.pdf 源码地址&#xff1a;https://nerfstereo.github.io/ 概述 针对深度估计的标签数据难以获取&#xff0c;自监督方法在病态&#xff08;遮挡、非朗伯面&#xff09;区域的表现差&#xff0c;跨域泛化能力弱的问题&…

【jvm系列-06】深入理解对象的实例化、内存布局和访问定位

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

Vue——组件基础

目录 定义一个组件​ 使用组件​ 传递 props​ 监听事件​ 通过插槽来分配内容​ 动态组件​ DOM 模板解析注意事项​ 大小写区分​ 闭合标签​ 元素位置限制​ 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行单独的思考。在实际应…

Learning to summarize from human feedback导读(1)

总结&#xff1a; &#xff08;1&#xff09;生成摘要等模型&#xff0c;虽然有评估方法&#xff0c;但是人类总结的质量依旧难以相比 总结&#xff1a; &#xff08;1&#xff09;在各种NLP任务中&#xff0c;大规模语言模型的预训练以及取得了很高的性能 &#xff08;2&am…

PHP快速入门09-正则相关,附一定要学会的20个高频使用案例

文章目录前言一、正则表达式介绍二、正则高频案例20个2.1 检查字符串是否以字母开头2.2 检查字符串是否以数字开头2.3 检查字符串是否包含特定字符2.4 检查字符串是否以特定字符结尾2.5 检查字符串是否为纯数字2.6 检查字符串是否为纯字母2.7 检查字符串是否为有效的电子邮件地…

Bean对象的作用域和生命周期

文章目录&#xff1a;一.Bean的作用域 (1)Bean作用域的含义 &#xff08;2)Bean的6种作用域 二.Bean的生命周期&#xff08;1&#xff09;开辟内存空间 &#xff08;2&#xff09; 属性注入 &#xff08;3&#xff09;初始化 &#xff08;4&#xff09;使用Bean &#xff08;…

【CSDN|每日一练】运输石油

目录 运行结果题目描述输入描述:输出描述:示例代码结语运行结果 题目描述 某石油公司需要向A、B两地运输石油。 两地的需求量不同,而一辆车只能装载一定量的石油。 经过计算A地需要a辆车,B地需要b辆车运输才能满足需求。 现在一共有n辆车分布在各地,每辆车前往A、B两地…

HFSS一些使用技巧总结

1. 快捷键&#xff1a; CTRLH&#xff0c;隐藏选择的object、face 字母E&#xff0c;选择edge&#xff08;线&#xff09; alt左键双击九个区域&#xff0c;切换9个不同的视角&#xff08;与789组合使用) 2. 复制&#xff1a; 这样的复制好处在于&#xff1a;复制完的物体相…

使用Excel打造一款个人日志系统

写在前面 我很多年前看过晨间日志的奇迹这一本书&#xff0c;我深受启发&#xff0c;这本书的中心思想就是通过九宫格的方式写连体日志&#xff0c;自己可以方便查找而有而且有激情去完成这个日志&#xff0c;书中推荐的方法是使用excel写日志。但是自己总感觉用excel过于麻烦…

Java 源码中的 <? extends U>与 <? super L>是什么?

目录 ? extends U ? super L 总结一下: ? extends U 其中extends意思为&#xff1a;扩大;扩展;延长&#xff0c;&#xff1f;我们可以把他看作一个通配符&#xff0c;匹配所有的接口&#xff0c;U就一个泛型占位符&#xff0c;所以连在一起可联想到&#xff0c;从U…

前后端分离下的-SpringSecurity

前后端分离下的SpringSecurity 项目创建 使用SpringBoot初始化器创建SpringBoot项目 修改项目依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2…

电容笔和Apple pencil的区别是什么?好用电容笔推荐

Apple Pencil与目前市场上常见的电容笔最大的不同之处在于&#xff0c;普通电容笔并不具备苹果Pencil特有的重力压感&#xff0c;而仅仅是一种倾斜的压感。不过&#xff0c;其在其它方面的表现也很出色&#xff0c;与Apple Pencil相似&#xff0c;而且价格仅为200元。现在&…

项目管理中的冲突是什么?

项目管理中的冲突可以采取多种不同的形式。团队成员在创意愿景上存在分歧&#xff0c;与高层管理人员就期望和时间表发生争执&#xff0c;甚至与第三方供应商发生争执&#xff0c;都是项目冲突的主要例子。 冲突的常见原因是什么&#xff1f; 基于项目的组织内部冲突的典型原因…

【记录】Git连接gitee、新建仓库

学习记录1.连接gitee2.新建仓库1.连接gitee https://www.cnblogs.com/cokefentas/p/14727592.html git安装与卸载 apt-get install git apt-get remove gitgit配置 配置用户名 git config --global user.name "your name" 配置邮箱 git config --global user.email…

2023都说测试行业饱和了,为什么我们公司新招的的测试开了15K?

其实每年都有人说测试行业饱和了&#xff0c;但依旧有很多人找到了薪资不错的工作。来说说我的看法吧&#xff0c;我认为不用担心测试会饱和的问题&#xff0c;我们人口基数大&#xff0c;任何一个行业都有竞争&#xff0c;这是非常正常的情况。而且在有技术能力的人面前永远没…

Vue3通透教程【十一】初探TypeScript

文章目录&#x1f31f; 写在前面&#x1f31f; TypeScript是什么&#xff1f;&#x1f31f;TypeScript 增加了什么&#xff1f;&#x1f31f;TypeScript 初体验&#x1f31f; 写在最后&#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue …

什么是进程,线程,协程

一.进程1.简介计算机的核心是CPU&#xff0c;它承担了所有的计算任务&#xff1b;而操作系统是计算机的管理者&#xff0c;它负责任务的调度、资源的分配和管理&#xff0c;统领整个计算机硬件&#xff1b;应用程序则是具有某种功能的程序&#xff0c;程序是运行于操作系统之上…

十分钟验证一个轻量化车联网解决方案

智能网联汽车在车联网的应用上&#xff0c;通常是以智能传感器、物联网、GIS技术为基础&#xff0c;结合大数据、人工智能技术&#xff0c;通过OT&#xff08;Operation tecnology&#xff09;和IT&#xff08;information tecnology&#xff09;融合的方式&#xff0c;实现智能…

使用Ubuntu22.04搭建k8s环境和一些k8s基础知识

minikube搭建 基本环境 我使用virtualBox构建的ubuntu&#xff0c;选择4核4G内存minikube是一个K8S集群模拟器&#xff0c;可以快速构建一个单节点的集群&#xff0c;用于在本地测试和开发首先使用官方脚本安装docker curl -fsSL https://test.docker.com -o test-docker.sh…

nacos源码服务注册

nacos服务注册序言1.源码环境搭建1.1idea运行源码1.2 登录nacos2.服务注册分析2.1 客户端2.1.1容器启动监听2.1.2注册前初始化2.1.3注册服务2.2 服务端2.2.1注册2.2.2重试机制3.注意事项序言 本文章是分析的是nacos版本2.2 这次版本是一次重大升级优化&#xff0c;由原来&#…