Acwing---797.差分

news2024/12/26 0:57:01

差分

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

输入一个长度为 n n n 的整数序列。

接下来输入 m m m 个操作,每个操作包含三个整数 l , r , c l,r,c l,r,c,表示将序列中 [ l , r ] [l,r] [l,r] 之间的每个数加上 c c c

请你输出进行完所有操作后的序列。

输入格式
第一行包含两个整数 n n n m m m

第二行包含 n n n 个整数,表示整数序列。

接下来 m m m 行,每行包含三个整数 l , r , c l,r,c lrc,表示一个操作。

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

数据范围
1 ≤ n , m ≤ 100000 , 1≤n,m≤100000, 1n,m100000,
1 ≤ l ≤ r ≤ n , 1≤l≤r≤n, 1lrn,
− 1000 ≤ c ≤ 1000 , −1000≤c≤1000, 1000c1000,
− 1000 ≤ 整数序列中元素的值 ≤ 1000 −1000≤整数序列中元素的值≤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

2.基本思想

前缀和的逆运算

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

差分数组:

首先给定一个原数组aa[1], a[2], a[3],,,,,, a[n];

然后我们构造一个数组bb[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];

图示:

在这里插入图片描述
我们只要有b数组,通过前缀和运算,就可以在O(n) 的时间内得到a数组 。

话说有这么一个问题:

给定区间[l ,r ],让我们把a数组中的[ l, r]区间中的每一个数都加上c,即 a[l] + c , a[l+1] + c , a[l+2] + c ,,,,,, a[r] + c;

暴力做法是for循环lr区间,时间复杂度O(n),如果我们需要对原数组执行m次这样的操作,时间复杂度就会变成O(n*m)。有没有更高效的做法吗? 考虑差分做法。

始终要记得,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(红色部分),但我们只要求lr区间加上c, 因此还需要执行 b[r+1] - c,让a数组中a[r+1]及往后的区间再减去c(绿色部分),这样对于a[r] 以后区间的数相当于没有发生改变。

因此我们得出一维差分结论:给a数组中的[ l, r]区间中的每一个数都加上c,只需对差分数组bb[l] + = c, b[r+1] - = c。时间复杂度为O(1), 大大提高了效率。
总结:

在这里插入图片描述

3.代码实现

import java.util.Scanner;

public class Main {
    static int N = 100010;
    static int[] a = new int[N], b = new int[N];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        for (int i = 1; i <= n; i++) a[i] = sc.nextInt();//读入数组
        for (int i = 1; i <= n; i++) insert(i, i, a[i]);//插入
        while (m-- > 0) {
            int l = sc.nextInt(), r = sc.nextInt(), c = sc.nextInt();
            insert(l, r, c);
        }
        for (int i = 1; i <= n; i++) {
            a[i] = b[i] + a[i - 1];//前缀和运算
            System.out.print(a[i] + " ");
        }//输出
    }

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

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

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

相关文章

2024新利好!一文读懂Shopee 3PF PFF一店多运模式

2023年年底&#xff0c;Shopee平台又有大动作&#xff01;正式上线了3PF PFF一店多运模式&#xff0c;已完成库存管理模式升级的三方仓卖家&#xff0c;即可开启一店多运新模式。 图源&#xff1a;Shopee 一、3PF PFF模式优势解析 三方仓一店多运&#xff08;3PF PFF&#xf…

什么可以用手机蓝牙控制LED???#串口通信【下】

什么可以用手机蓝牙控制LED&#xff1f;&#xff1f;&#xff1f;#串口通信【下】 前言预备知识1.小白玩串口控制的ASSII避坑1.1问题引入1.2解决问题 2.串口支持单词型指令控制2.1实现串口支持单词型指令控制的核心思路2.2利用字符数组来承接单词型指令2.3利用strstr函数来查找…

【Java程序设计】【C00202】基于(JavaWeb+SSM)的信访管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的信访管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的信访管理系统 本系统分为管理员、信访人员和工作人员3个功能模块。 管理员&#xff1a;管理员登录进入信访管理系…

从0到1入门C++编程——06 类和对象之多态、文件操作

文章目录 多态1.多态基本概念2.多态案例——计算器3.纯虚函数和抽象类4.多态案例——制作饮品5.虚析构和纯虚析构6.多态案例——电脑组装 文件操作1.文本文件--写文件2.文本文件--读文件3.二进制文件--写文件4.二进制文件--读文件 多态 1.多态基本概念 多态是C面向对象的三大…

RHEL 9上创建本地Yum/DNF存储库

1.挂载RHEL9 ISO文件或DVD 我们假设RHEL 9 iso文件已经复制到系统中。运行以下mount 命令将 ISO文件挂载到/var/repo文件夹。 $ sudo mkdir /var/repo $ sudo mount -o loop rhel-baseos-9.0-x86_64-dvd.iso /var/repo/ 如果是 DVD,请运行 $ sudo mount /dev/sr0 /var/repo/…

系统架构设计师-22年-下午答案

系统架构设计师-22年-下午答案 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选两题作答 试题一 (25分) 说明 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。…

代码随想录 Leetcode669. 修剪二叉搜索树

题目&#xff1a; 代码(首刷看解析 2024年1月31日&#xff09;&#xff1a; class Solution { public:TreeNode* trimBST(TreeNode* root, int low, int high) {if (!root) return root;if (root->val < low) {TreeNode* node trimBST(root->right,low,high);return…

【Linux】yum与vim命令详解

&#x1f497;个人主页&#x1f497; ⭐个人专栏——Linux学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读1. yum命令1.1 基本使用1.2 注意事项1.3 lrzsz软件包示例 2. vim命令2.1 vim的基本概念2.2 vim配置2.3 vim的基本操作2.3…

远程电脑解决突然无法的复制粘贴问题

方法一 - 重新启动RDP剪贴板 结束掉剪切板服务 创建新任务rdplclip.exe任务 重新复制粘贴&#xff0c;即可解决 方法二&#xff1a; 重新启动 Windos 资源管理器 方法三&#xff1a;设置远程桌面连接的本地资源配置&#xff0c;勾选剪切板服务&#xff0c;并在详细信息中勾选…

如何用 python +ddt+excel 实现接口自动化测试

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 “ 接口自动化测试是指通过编写代码或使用工具&#xff0c;模拟…

计算机网络——网络层(3)

计算机网络——网络层&#xff08;3&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)1 网络层——控制平面因特网中自治系统内部的路由选择总括考虑因素总结 ISP之间的路由选择&#xff1a;BGP考虑因素总结 SDN控制层面重要组件和功能总结 ICMP主要功能和特点…

Mysql单行函数练习

数据表 链接&#xff1a;https://pan.baidu.com/s/1dPitBSxLznogqsbfwmih2Q 提取码&#xff1a;b0rp --来自百度网盘超级会员V5的分享 单行函数练习 单行函数(一行数据返回一个结果) #1.显示系统时间(注:日期时间) #2.查询员工工号,姓名,工资以及提高百分之20后的结果(new…

消费观念升级,品牌又有哪些新的营销玩法?

一方面在传统消费升级的背景下&#xff0c;国民的消费预期不断改善&#xff0c;购买力持续增强&#xff0c;另一方面&#xff0c;随着Z时代成为消费时代的主力军&#xff0c;他们的需求推动了消费行业向个性化、细分化、多样化的方向发展。那在这一消费环境下&#xff0c;品牌又…

深入解析企业培训教育系统开发:源码探秘与技术实践

当下&#xff0c;为了提高员工的技能水平、促进团队的协同合作&#xff0c;企业培训教育系统成为了一个不可或缺的组成部分。本篇文章&#xff0c;小编将为大家讲述企业培训教育系统的开发&#xff0c;揭示其源码背后的奥秘以及相关的技术实践。 一、概述 企业培训教育系统通常…

时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)

目录 引言 LSTM的预测效果图 LSTM机制 了解LSTM的结构 忘记门 输入门 输出门 LSTM的变体 只有忘记门的LSTM单元 独立循环(IndRNN)单元 双向RNN结构(LSTM) 运行代码 代码讲解 引言 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种常用的循环神经网络&a…

本地搭建Plex私人影音网站并结合内网穿透实现公网远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网址的静态码和活码怎么做?学会在线制作更快捷

现在获取信息大多都是在手机上搜索的&#xff0c;所以将现在很多推广信息的链接都会选择生成二维码之后&#xff0c;通过扫码在手机上获取传递的信息&#xff0c;那么如何将网址制作二维码使用呢&#xff1f;其实方法很简单&#xff0c;接着网址二维码生成器就可以轻松完成在线…

小程序定制开发前,应该考虑些什么?

引言 在移动互联网时代&#xff0c;小程序已经成为许多企业和个人推广业务、提供服务的理想平台。然而&#xff0c;在进行小程序定制开发之前&#xff0c;开发者和业务方需要细致入微地考虑一系列关键因素&#xff0c;以确保最终的小程序既能满足用户需求&#xff0c;又能够顺…

【附安装包】Java/JDK介绍、下载、安装、配置与使用(保姆级教程)

目录 一、概述 1、Java历史 2、Java介绍&#xff08;JDK、JRE、JVM&#xff09; 3、Java运行机制 4、Java跨平台性 5、JDK版本选择 二、下载安装 1、JDK下载 2、JDK安装 三、配置环境变量 四、测试与使用 1、测试 2、使用 一、概述 1、Java历史 Java语言诞生于SU…

R语言韦恩图的绘制

韦恩图是一种用于展示多个集合之间的交集和并集关系的图形工具。它由英国数学家约翰韦恩于1880年首次引入&#xff0c;因此得名为"韦恩图"。韦恩图利用圆形的重叠区域来表示集合之间的交集&#xff0c;而圆形的非重叠区域则表示各个集合的独立部分。 韦恩图通常用于…