差分算法模板

news2025/1/23 1:10:30

差分算法模板

  • 一维差分
    • 一维insert函数(构造差分数组和实现区域加数操作)
    • 一维差分模板题
  • 二维差分
    • 二维insert函数(构造差分数组和实现区域加数操作)
    • 二维差分模板题

一维差分

差分主要是计算出某个区域段的数分别加上一个数

先给定一个原数组a:a[1], a[2], a[3], a[n];
然后我们构造一个数组b : b[1] ,b[2] , b[3], b[i];
使得 a[i] = b[1] + b[2 ]+ b[3] +, + b[i]
也就是说,a数组是b数组的前缀和数组,反过来我们把b数组叫做a数组的差分数组。换句话说,每一个a[i]都是b数组中从头开始的一段区间和。

差分数组公式: b[i] = a[i] - a[i - 1]

一维insert函数(构造差分数组和实现区域加数操作)

我们先来讲讲用insert函数实现区域加数操作

我们要记得,a数组是b数组的前缀和数组,比如对b数组的b[i]的修改,会影响到a数组中从a[i]及往后的每一个数

比如首先让差分b数组中的 b[l] + c ,a数组变成 a[l] + c ,a[l+1] + c, a[n] + c
理解了这一点,就可以推出以下的公式
在这里插入图片描述

b[l] + c,效果使得a数组中 a[l]及以后的数都加上了c(红色部分),但我们只要求l到r区间加上c, 因此还需要执行 b[r+1] - c,让a数组中a[r+1]及往后的区间再减去c(绿色部分),这样对于a[r] 以后区间的数相当于没有发生改变。

得出一维差分结论:给a数组中的[ l, r]区间中的每一个数都加上c,
只需对差分数组b做 b[l] + = c, b[r+1] - = c

同时,通过这个insert函数,我们也可以用来构造差分数组

void insert(int l, int r, int v)
{
    b[l] += v;
    b[r + 1] -=v;
}
for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
        insert(i, i, a[i]);  //差分数组默认初始化为
    }  

根据差分数组公式:b[1] = a[1] b[2] = a[2] - a[1],
可以试着 模拟几次数据
i = 1时, 在[1, 1] 这个区间 加上a[i]—> b[1] = a[1] b[2] - = a[1]
i = 2时候, b[2] += a[2] --> 也就相当于 b[2] = a[2] - a[1]
(前面i = 1的时候,减去过a[1],后面i = 2时,加上a[2])
这种做法就比较巧妙

一维差分模板题

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<cstdio>

using namespace std;

//一维差分模板
//差分的作用:就是用来计算某个区间断,加上某个数
//注意:差分和前缀和的数组下标都是从1开始的

const int N = 1e5 + 10;
int a[N];  //原数组
int b[N];  //差分数组
//差分数组的前缀和就是原数组

//差分数组的求法:
/*
    差分数组默认初始化为0,但是要实现,在某个区间端加上某一个数
    就要先有原来数组的数据,然后再进行加数的操作
    这里统一,可以使用insert(int l, int r, int v)函数来进行操作
    
    l代表左端点,r代表端点,v代表加的数的大小
    函数的作用:在区间[l, r]这个区间中,加上v这个数
    
    赋给原来数组的数据可以用  insert(i, i, a[i]);  

    例如 :b[1] = 0;  在i = 1的时候,在[1, 1]这个区间中插入 a[i]的值
    但是由于插入之后,后面前缀和数组也要发生变化,所以后面也得减去v
    
    b[l]变化 ,b[l]后面的也得变化,[l, r]也加上了v, 所以r + 1后面的,都减去v
*/

//注意:此处要假设  a[n] 是b[n]的前缀和
//即 : a[n] = b[1] + b[2] + b[3]...... + b[n];

void insert(int l, int r, int v)
{
    b[l] += v;
    b[r + 1] -=v;
}

int main()
{
    int n, m;
    cin >> n >> m;
    
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
        insert(i, i, a[i]);  //差分数组默认初始化为
    }  
    
    int l, r, c;
    while(m--)
    {
        cin >> l >> r >> c;
        insert(l, r, c);
    }
    
    //算差分和数组
    for(int i = 1; i <= n; i++)
    {
        b[i] += b[i - 1];    // 这里直接在原数组上进行了前缀和的计算,a[i] = b[i] + a[i - 1];
    }
    
    for(int i = 1; i <= n; i++)
    {

> 这里是引用

        cout << b[i] << " ";
    }
    return 0;
}

这里注意:算出差分数组b[i],并不是结果数组,结果数组是a[i],要对b[i]进行前缀和算出a数组

二维差分

一维变成二维,其他步骤基本没变化,变化的是insert函数

二维insert函数(构造差分数组和实现区域加数操作)

在这里插入图片描述
在这里插入图片描述

这里采用了acwing中一位大佬的题解,讲解的非常好
然后我们就得到了二维差分数组中的差分数组

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

同样利用这个insert函数,也能构造出二维的差分数组,思路跟一维的类似,这里就不在详细说了,不懂的再去看看前面一维那部分的讲解。

二维差分模板题

在这里插入图片描述
在这里插入图片描述

#include<iostream>
#include<cstdio>

using namespace std;

const int N = 1010;
int a[N][N],b[N][N];
int n, m, q;


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()
{
    
    cin >> n >> m >> q;
    
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            cin >> a[i][j];
            insert(i, j, i, j, a[i][j]); //差分数组初始化
        }
    }
    
    //区间加上某个数
    int x1, y1, x2, y2, c;
    while(q--)
    {
        cin >> x1 >> y1 >> x2 >> y2 >> c;
        insert(x1, y1, x2, y2, c);   
    }
    
    //算出a[n]
    
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            //可以在在b数组本身上进行前缀和加的计算()
            //方式一:
            //b[i][j] += b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1];
            
            //也可以这样
            //方式二:用原数组进行 a[i][j] = a[i -1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j]
            
            a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j];
        } 
    }
    
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            //方式一:
            //cout << b[i][j] << " ";
            
            //方式二:
            cout << a[i][j] << " ";
            
        }
        cout << endl;
    }
    
    return 0;
}

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

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

相关文章

datavrap-各种各样的条形图(含详细操作步骤)

静态条形图&#xff1a;正确设置数据即可&#xff0c;导出的图形不会随着时间变化 最普通的静态条形图 黑色系风格的静态条形图 动态条形图&#xff1a;导出的图形会随着时间变化 普通的动态条形图 带数字滚动效果的动态条形图 简单的Top排行榜动态条形图 格式更丰富的Top排行榜…

细说JavaScript表达式和运算符号详解

除了简单的表达式还有复杂的表达式&#xff0c;它是由简单表达式构成的&#xff0c;将简单表达式组合成复杂表达式最常见的方法就是使用运算符 一、表达式 表达式分为简单表达式和复杂表达式&#xff0c;但最后的结果均是返回一个值 1、简单表达式 简单表达式又称为原始表达式…

从零开始做题:逆向wdb_2018_2nd_easyfmt

1.题目信息 2.解题分析 格式化字符串漏洞 如何确定偏移 Do you know repeater? 输入AAAA.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p. 输出AAAA.0xffffd658.0x64.0xf7ffdc08.0xf7ffcd00.0xffffd77c.0x41414141.0x2e70252e.0x252e7025.0x70252e70.0x2e70252e.0x252e7025.0x70252…

JAVA开发入门

文章目录 计算机基本概念DOS常用命令JAVA语言发展史JDK下载JAVA体系与特点JDK安装JAVA环境变量配置 计算机基本概念 计算机组成原理 计算机组装 计算机&#xff1a;电子计算机&#xff0c;俗称电脑。是一种能够按照程序运行&#xff0c;自动、高速处理海量数据的现代化智能电子…

git常用命令集合及其演示

文章目录 一.git常用命令集合及其演示1.git config --list 查看配置信息2.git status 查看当前仓库的状态3.git add . 加到暂存区4.git commit -m "描述信息" 添加到版本库5.git diff xxxx 查看xxxx文件修改了哪些内容&#xff0c;相比于暂存区的区别6.git rm --cach…

阿里云和AWS之间的应用程序防火墙比较及选择建议!

对于大多数开发人员来说&#xff0c;托管在云中的 Web 应用程序或 REST API 是一种常见方案。但是&#xff0c;并非每个应用程序都具有相同的安全级别。将 Web 应用程序防火墙 &#xff08;WAF&#xff09; 添加到 Web 应用程序是提高安全性的有用方法。 在本文中&#xff0c;…

GitHub API使用--获取GitHub topic

目录标题 技术简介申请token简单使用使用Java调用获取GitHub topic总结 技术简介 GitHub API是一个功能强大的工具&#xff0c;为开发者提供了访问和操作GitHub平台上资源的途径。无论是构建个人工具&#xff0c;集成自动化流程&#xff0c;还是开发应用程序&#xff0c;GitHu…

启英泰伦推出「离线自然说」,离线语音交互随意说,不需记忆词条

离线语音识别是指不需要依赖网络&#xff0c;在本地设备实现语音识别的过程&#xff0c;通常以端侧AI语音芯片作为载体来进行数据的采集、计算和决策。但是语音芯片的存储空间有限&#xff0c;通过传统的语音算法技术&#xff0c;最多也只能存储数百条词条&#xff0c;导致用户…

MySQL:ERROR 1067 - Invalid default value for ‘end_time‘【解决办法】

问题描述&#xff08;mysql版本&#xff1a;5.7.36&#xff09;&#xff1a; 今天在使用Navicat可视化工具运行sql文件&#xff0c;发生如下错误&#xff1a; 在图中&#xff0c;sql是没有错误的&#xff0c;但是运行报错Invalid default value for end_time。 解决办法&#…

ACM论文LaTeX模板解析(一)| 模板下载与安装

本文收录于专栏&#xff1a;ACM 论文 LaTeX模板解析&#xff0c;本专栏将会围绕ACM 论文 LaTeX模板解析持续更新。欢迎点赞收藏关注&#xff01; 文章目录 1. 引言2. 下载方式 1. 引言 计算机械协会&#xff08;ACM&#xff0c;Association for Computing Machinery&#xff0…

Linux环境基础开发工具的使用(上)

文章目录 Linux 软件包管理器 yum什么是软件包关于rzsz查看软件包安装软件卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行模式各命令汇总 配置vim Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程…

[NAND Flash 6.2] NAND 初始化常用命令:复位 (Reset) 和 Read ID 和 Read UID 操作和代码实现

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 把下文中的字母和数字用`包起来, 中文不变。 全文 4400 字,主要内容 复位的目的和作用? NAND Reset 种类:FFh, FCh, FAh, FDh 区别 Reset 操作步骤 和…

叉车车载终端定制_基于MT6762安卓核心板的车载终端设备方案

叉车车载终端是一款专为叉车车载场景设计的4英寸Android车载平板电脑。它采用了高能低耗的8核ARM架构处理器和交互开放的Android 12操作系统&#xff0c;算力表现强大。此外&#xff0c;该产品还具备丰富的Wi-Fi-5、4G LTE和蓝牙等通讯功能&#xff0c;可选配外部车载蘑菇天线&…

Python实现分位数回归模型(quantreg算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 分位数回归是简单的回归&#xff0c;就像普通的最小二乘法一样&#xff0c;但不是最小化平方误差的总和…

vue3移动端适配

将vue3项目中的 px 单位&#xff0c;自动转换为rem 单位 可以看到这里会根据页面缩小放大变化 需要安装两个插件&#xff0c;看步骤 amfe-flexible --- 默认指向2.2.1版本 npm i -S amfe-flexiblepostcss-pxtorem --- 默认指向6.0.0版本 --save-dev 参数会把依赖包的版本信…

【RabbitMQ】2 RabbitMQ介绍与架构

目录 简介架构Connection 和Channel关系工作流程生产者发送消息的流程消费者接收消息的过程 RabbitMQ数据存储存储机制 安装和配置RabbitMQRabbitMQ常用操作命令 简介 RabbitMQ&#xff0c;俗称“兔子MQ”&#xff08;可见其轻巧&#xff0c;敏捷&#xff09;&#xff0c;是目…

【msvcr120.dll】修复电脑出现msvcr120.dll找不到的详细方法

“msvcr120.dll丢失”。那么&#xff0c;msvcr120.dll丢失是什么意思呢&#xff1f;msvcr120.dll丢失的原因是什么&#xff1f;msvcr120.dll的作用又是什么呢&#xff1f;当msvcr120.dll丢失时&#xff0c;会对计算机产生什么影响&#xff1f;本文将详细介绍这些问题&#xff0…

鸿蒙Harmony是如何影响Android工程师的呢?

其实鸿蒙在2019就已经出来了&#xff0c;那时候还是套壳Android的。从2023年9月的发布会上&#xff0c;华为宣布鸿蒙原生应用全面启动、HarmonyOS NEXT亮相以后&#xff0c;围绕着纯血鸿蒙展开的鸿蒙应用生态发展迅猛&#xff0c;目前已经有包括社交、金融、影音、游戏、资讯、…

现代雷达车载应用——第3章 MIMO雷达技术 3.3节 汽车MIMO雷达测角

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 3.3 汽车MIMO雷达测角 在发射天线和接收天线分别为Mt和Mr的汽车MIMO雷达中&#xff0c;可以合成一个由Mt*Mr个阵元组成的虚拟ULA&#xff0c;单元间…

解决报错:AttributeError: module ‘torch‘ has no attribute ‘_six‘

报错代码&#xff1a; if torch._six.PY3:import importlibimport importlib.utilimport sys这里的意思是判断你的python版本是否是python3&#xff0c;如果是PY37&#xff0c;就是判断你的python版本是不是python3.7&#xff0c;源码&#xff1a; PY37 sys.version_info[0]…