一维前缀和一维差分(下篇讲解二维前缀和二维差分)(超详细,python版,其他语言也很轻松能看懂)

news2024/9/25 15:28:22

本篇博客讲解一维前缀和,一维差分,还会给出一维差分的模板题,下篇博客讲解 二维前缀和&二维差分。

一维前缀和:

接触过算法的小伙伴应该都了解前缀和,前缀和在算法中应用很广,不了解也没有关系,这里简单介绍一下什么是前缀和。

如数组a[0,1,2,3,4],则数组a的前缀和为b[0,1,3,6,10],也就是b[i] = a[i] + b[i - 1],利用前缀和我们可以快速求出在数组a在区间[l,r]中的和为多少,如在[2,3]区间内数组a的和为b[3]-b[1] = 5。一维前缀和的递推公式为b[i] = a[i] + b[i - 1]

一维差分:

类似于数学中的求导和积分,差分可以看成前缀和的逆运算。

什么意思?简单来说,如果存在一个数组a,数组a的前缀和数组为b,则数组a就是数组b的差分数组!b是a的前缀和数组!

简单说一种情况,有一个数组,现在需要对数组进行多次操作,每次操作都是在区间[l,r]上加上一个相同的数或者减掉一个相同的数,所有操作完成后,数组为多少?

如果暴力法的话,每次操作的时间复杂度都为O(n),如果操作次数一多,算法可能就会超时,这是就需要用差分来处理这类问题,差分会将每次操作的时间复杂度都降为O(1)。

差分数组:

首先给定一个原数组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数组?

最为直接的方法

如下:

a[0 ]= 0;

b[1] = a[1] - a[0];

b[2] = a[2] - a[1];

b[3] =a [3] - a[2];

b[n] = a[n] - a[n-1];

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

首先让差分b数组中的 b[l] + c ,a数组变成 a[l] + c ,a[l+1] + c, a[n] + c;

然后我们打个补丁,b[r+1] - c, a数组变成 a[r+1] - c,a[r+2] - 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。时间复杂度为O(1), 大大提高了效率。

差分数组加减完后,由公式b[i] = a[i] - a[i - 1] 逆推出 前缀和数组a[i] = b[i] + a[i - 1]

题目:差分

题目链接:差分

输入一个长度为 n的整数序列。接下来输入 m个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r]之间的每个数加上 c。请你输出进行完所有操作后的序列。

输入格式
第一行包含两个整数 n和 m。
第二行包含 n个整数,表示整数序列。
接下来 m行,每行包含三个整数 l,r,c,表示一个操作。

输出格式
共一行,包含 n个整数,表示最终序列。

数据范围
1≤n,m≤100000,
1≤l≤r≤n,
−1000≤c≤1000,
−1000≤整数序列中元素的值≤1000
输入样例:

6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1

输出样例:

3 4 5 3 4 2

代码及详细注释:

n, m = map(int, input().split())  # 输入两个整数n和m
a = list(map(int, input().split()))  # 输入n个整数,存储在列表a中
a = [0, *a]  # 在列表a的开头插入一个0
b = [0] * (n + 2)  # 初始化长度为n+2的全0列表b

# 计算列表b中每个元素的值
for i in range(1, n + 1):
    b[i] = a[i] - a[i - 1]

# 根据输入的操作更新列表b的值
for _ in range(m):
    l, r, c = map(int, input().split())
    b[l] += c
    if r != n: # 判断是否会出界,如果b数组定义的很长,则无需判断
        b[r + 1] -= c
        
# 也可以这样写,但空间复杂度会高一点
# res = [0] * n
# res[0] = b[1]
# for i in range(2, n + 1):
#     res[i - 1] = b[i] + res[i - 2]
# print(" ".join(map(str, res)))

# 计算最终结果
for i in range(1, n + 1):
    b[i] += b[i - 1]

# 输出最终结果,去除首尾两个元素并将列表转换为字符串输出
print(' '.join(map(str, b[1:-1])))


总结:

前缀和&差分可以说是算法竞赛中必考的知识点,需要熟练掌握。
一维差分总结就两个公式:

  1. b[l] + = c, b[r+1] - = c
  2. b[i] = a[i] - a[i - 1]

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

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

相关文章

【算法】小强爱数学(迭代公式+数论取模)

文章目录 1. 问题2. 输入3. 输出4. 示例5. 分析6. 思路7. 数论,取模相关公式8. 数论,同余定理9. 代码 1. 问题 小强发现当已知 x y B xyB xyB以及 x y A xyA xyA时,能很轻易的算出 x n x_ {n} xn​ y n y_ {n} yn​ 的值.但小强想请你在已知A和B的…

【No.16】蓝桥杯动态规划下|线性DP装箱问题|计数DP0/1背包的方案数|过河卒|完全背包小明的背包2|最长公共子序列|蓝桥骑士|推荐练习题(C++)

线性DP&#xff0c;0/1背包简化版&#xff0c;装箱问题 【题目描述】有一个箱子容量为V(正整数&#xff0c; 0 ≤ V ≤ 20000 0 \le V \le 20000 0≤V≤20000)&#xff0c;同时有n个物品( 0 < n ≤ 30 0 < n \le 30 0<n≤30)&#xff0c;每个物品有一个体积(正整数)。…

ubuntu20.04安裝輸入法

文章目录 前言一、操作過程1、安装fcitx-googlepinyin2、配置language support 前言 參考文獻 一、操作過程 1、安装fcitx-googlepinyin sudo apt-get install fcitx-googlepinyin2、配置language support 第一次點擊進去&#xff0c;會讓你安裝 點擊ctrl和空格切換中英文…

Gin入门指南:从零开始快速掌握Go Web框架Gin

官网:https://gin-gonic.com/ GitHub:https://github.com/gin-gonic 了解 Gin Gin 是一个使用 Go 语言开发的 Web 框架,它非常轻量级且具有高性能。Gin 提供了快速构建 Web 应用程序所需的基本功能和丰富的中间件支持。 以下是 Gin 框架的一些特点和功能: 快速而高效:…

000_coolprop_in_matlab在Matlab中使用CoolProp

在Matlab中使用CoolProp 简介 CoolProp是一个开源的热力学性质库&#xff0c;可以计算多种流体的热力学性质。CoolProp支持多种编程语言&#xff0c;包括Python、C、Matlab等。本文将介绍如何在Matlab中使用CoolProp。 CoolProp官网 本文所使用的Matlab版本为R2021a。 在Ma…

Zabbix与Prometheus区别简述

Zabbix与Prometheus区别简述 历史沿革 一、监控工具简介 1、Zabbix https://www.zabbix.com/cn/download Zabbix是传统的监控系统&#xff0c;出现比云原生早&#xff0c;使用的是SQL关系型数据库&#xff1b;开源监控软件&#xff0c;遵守 GPLv2开源协议&#xff0c;起源于…

为什么说 C/C++ 不适合做 Web 开发?

Web开发是当今信息技术领域的重要组成部分&#xff0c;涉及创建、维护和优化供浏览器访问的网站和应用程序。在众多编程语言中&#xff0c;C/C因其高效、灵活和接近硬件的特性而备受推崇&#xff0c;但在Web开发领域&#xff0c;它们并不被视为首选工具。本文将从以下几个方面探…

Linux Sftp和Scp

scp 和 sftp 区别 1 scp 能将远程文件复制到另一个远程机&#xff0c;sftp 不能。sftp为 SSH的其中一部分&#xff0c;是一种传输档案至 Blogger 伺服器的安全方式 2.scp 没有删除/创建远程目录功能&#xff0c;sftp 有。scp 在需要进行验证时会要求你输入密码或口令。 3. FT…

【算法】回溯与深搜

方法论 1.构建决策树 2.设计代码&#xff1a;全局变量、dfs函数 3.剪枝&#xff0c;回溯 全排列 给定一个不含重复数字的整数数组 nums &#xff0c;返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff…

力扣---随机链表的复制

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 n…

进程和线程的关系与区别

目录&#xff1a; 导言&#xff1a; 正文&#xff1a; 一.进程 1.概念 2.进程控制块&#xff08;Process Control Block&#xff0c;PCB) 3.状态 4.优缺点 二.线程 1.概念 2.线程的设计理由与优点 3.缺点 三.进程与线程的区别与联系 导言&#xff1a; 在现代计算机…

ctf__

title: ctf 2.题目类别 3.题目的细分 4.例题 misc 0x05. 明文攻击 明文攻击是一种较为高效的攻击手段&#xff0c;大致原理是当你不知道一个zip的密码&#xff0c;但是你有zip中的一个已知文件&#xff08;文件大小要大于12Byte&#xff09;时&#xff0c;因为同一个zip压缩…

java数据结构与算法刷题-----LeetCode215. 数组中的第K个最大元素

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路&#xff1a;时间复杂度O( n n n)&#xff0c;空间复杂度…

大屏可视化综合展示解决方案

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.1.系统权限设计 3.…

STM32 CAN的位时序和波特率

STM32 CAN的位时序和波特率 位时序 STM32的CAN外设位时序中只包含3段&#xff0c;分别是同步段SYNC_SEG、位段BS1及位段BS2&#xff0c;采样点位于BS1及BS2段的交界处。其中SYNC_SEG段固定长度为1Tq&#xff0c;而BS1及BS2段可以在位时序寄存器CAN_BTR设置它们的时间长度&…

CISP 4.2备考之《安全支撑技术》知识点总结

文章目录 第一节 密码技术第二节 标识和身份鉴别技术第三节 访问控制技术 第一节 密码技术 密码学发展阶段&#xff1a;古典、近代、现代和公钥密码学及特点。 密码系统组成&#xff1a;明文、加密、密钥、解密、密文。 柯克霍夫原则&#xff1a;密钥保密&#xff0c;算法公开…

Stable Diffusion 本地训练端口与云端训练端口冲突解决办法

方法之一&#xff0c;修改本地训练所用的端口 1 首先&#xff0c;进入脚本训练器的根目录 例如&#xff1a;C:\MarkDeng\lora-scripts-v1.7.3 找到gui.py 2 修改端口号 因为云端训练器也是占用28000和6006端口 那么本地改成27999和6007也是可以的 保存退出&#xff0c;运行启动…

NX二次开发常用函数:UF_MODL_ask_feat_......(一)

最近学习NX二次开发发现有一些函数经常使用&#xff0c;俗话说得好&#xff0c;好记性不如烂笔头&#xff0c;现在做一下笔记&#xff0c;帮助理解。 UF_MODL_ask_feat_......所在头文件uf_modl.h 1、UF_MODL_ask_feat_body&#xff08;通过特征查询体&#xff09; 概述&…

liunx centos7 下通过yum删除安装已经安装的php

执行下面命令查看php相关的包 rpm -qa | grep php 只需要卸载几个名为common的包即可&#xff0c;其他同版本依赖会被全部删除&#xff0c;删除php71w-common&#xff0c;71w版本的依赖包全部会被删除。 查看php包的命令 rpm -qa | grep php 或 yum list installed | gre…

鸿蒙APP应用开发教程—超详细的项目结构说明

1. 新建项目 打开DevEco Studio, 选择 Create Project: 1.1 选择模版 Create Project - Choose Template 1.2 配置项目 Create Project - Configure Project 如果使用的是 DevEco 3.X 版本, 可以根据 Compile SDK版本选择不同的模式, 比如: 3.0.0(API 8)及更早 - 仅支持 …