AcWing 797. 差分——算法基础课题解

AcWing 797. 差分

题目描述

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

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

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

输入格式

第一行包含两个整数 n 和 m。

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

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

输出格式

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

数据范围

1≤n,m≤100000,

1≤l≤r≤n1,

−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

思路

差分数组的基本概念

差分数组 diff 是对原数组 arr 的一个变换,用于记录每个元素与前一个元素的差值。差分数组的主要优点是能够将区间增加或减少操作降低到常数时间复杂度。

差分数组的构建

对于原始数组 arr,其差分数组 diff 的构建方式如下:

diff[i] = arr[i] - arr[i - 1];

其中,arr[0] 假设为 0(如果数组索引从 1 开始)。因此,diff[1] = arr[1] - arr[0],以此类推。

区间更新操作

  • 要对原数组 arr 中的一个子区间 [l, r] 的所有元素加上一个值 x,你只需要:
    • diff[l] += x
    • diff[r + 1] -= x(如果 r + 1 在数组边界内)

代码示例

以下是一个 C++ 示例代码,用于演示如何使用差分数组:

#include <iostream>
#include <vector>using namespace std;void add_range(vector<int>& diff, int l, int r, int x) {diff[l] += x;if (r + 1 < diff.size()) {diff[r + 1] -= x;}
}int main() {int n;  // 数组长度cin >> n;vector<int> arr(n + 1, 0), diff(n + 2, 0);// 假设进行操作add_range(diff, 2, 5, 10);  // 在区间 [2, 5] 上加 10add_range(diff, 3, 7, 5);   // 在区间 [3, 7] 上加 5// 构建最终数组for (int i = 1; i <= n; i++) {arr[i] = arr[i - 1] + diff[i];cout << arr[i] << " ";}return 0;
}

这样,你就可以高效地对数组进行多次区间操作,并最终快速得到结果数组。

C++

#include <iostream>using namespace std;const int N = 1e5 + 10;
int arr[N];void insert(int l, int r, int num) {arr[l] += num;arr[r + 1] -= num;
}int main() {int n, m, tmp;scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &tmp);insert(i, i, tmp);}while (m--) {int l, r, c;scanf("%d%d%d", &l, &r, &c);insert(l, r, c);}for (int i = 1; i <= n; i++) {arr[i] += arr[i - 1];printf("%d ", arr[i]);}return 0;
}
#include <iostream>using namespace std;const int N = 100010;int n, m;
int a[N], b[N];void insert(int l, int r, int c) {b[l] += c;b[r + 1] -= c;
}int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);for (int i = 1; i <= n; i++) insert(i, i, a[i]);while (m--) {int l, r, c;scanf("%d%d%d", &l, &r, &c);insert(l, r, c);}for (int i = 1; i <= n; i++) b[i] += b[i - 1];for (int i = 1; i <= n; i++) printf("%d ", b[i]);return 0;
}

Go

package mainimport ("bufio""fmt""os"
)func insert(arr []int, l int, r int, c int) {arr[l] += carr[r+1] -= c
}func main() {var n, m, tmp intreader := bufio.NewReader(os.Stdin)fmt.Fscan(reader, &n, &m)arr := make([]int, n+10)for i := 1; i <= n; i++ {fmt.Fscan(reader, &tmp)insert(arr, i, i, tmp)}for i := 1; i <= m; i++ {var l, r, c intfmt.Fscan(reader, &l, &r, &c)insert(arr, l, r, c)}writer := bufio.NewWriter(os.Stdout)defer writer.Flush()for i := 1; i <= n; i++ {arr[i] += arr[i-1]fmt.Fprintf(writer, "%d ", arr[i])}
}

模板

给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c

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

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

相关文章

【前后端】django与vue的结合使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、前后端分离的简介二、django与vue的结合使用三、总结 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使用一些开发工具&a…

笔记:Python 列表与元组编程题(练习题)

文章目录 前言一、Python 列表与元组是什么&#xff1f;二、编程题总结 前言 欢迎阅读本编程练习题集&#xff0c;旨在帮助您加深对 Python 中列表&#xff08;List&#xff09;与元组&#xff08;Tuple&#xff09;的理解和应用。列表与元组是 Python 中常用的数据结构&#…

企业级DDoS防护与内网文件安全防护:全方位策略与技术实践

在数字化转型的浪潮中&#xff0c;企业面临着日益严峻的网络安全威胁&#xff0c;其中DDoS&#xff08;分布式拒绝服务&#xff09;攻击与内网文件防护是两个至关重要的议题。本文将深入探讨企业如何通过综合运用多种技术和策略&#xff0c;构建起强大的DDoS防护体系与内网文件…

YOLOv9训练结果分析->mAP、Precision、Recall、FPS、Confienc、混淆矩阵分析

简介 这篇博客&#xff0c;主要给大家讲解我们在训练yolov9时生成的结果文件中各个图片及其中指标的含义&#xff0c;帮助大家更深入的理解&#xff0c;以及我们在评估模型时和发表论文时主要关注的参数有那些。本文通过举例训练过程中的某一时间的结果来帮助大家理解&#xf…

vue项目启动npm install和npm run serve时出现错误Failed to resolve loader:node-sass

1.常见问题 问题1&#xff1a;当执行npm run serve时&#xff0c;出现Failed to resolve loader: node-sass&#xff0c;You may need to install it 解决方法&#xff1a; npm install node-sass4.14.1问题2&#xff1a;当执行npm run serve时&#xff0c;出现以下错误 Fa…

复杂算子onnx导出(2): 将graph写入到onnx

前文通过自定义导出实现了trace, 然后将输入输出节点连接起来就形成了graph, 接下来利用得到的graph写入到onnx文件中。通过onnx.helper就可以构建出一个onnx文件,并且保存下来。 1. onnx.helper 示例 onnx结构中,包括了nodes,initializer ,inputs,outputs,graph。然后指定…

水牛社靠谱吗,水牛社可以当做副业来做吗?

水牛社这个平台是否靠谱&#xff0c;能否作为副业的选择&#xff0c;一直是网友们热议的话题。实际上&#xff0c;水牛社是一个集合了众多网上赚钱活动任务和提供资源项目教程的综合性平台&#xff0c;它并非只局限于某一特定的项目&#xff0c;而是展现出多样化的特点。随着网…

SpringCloud系列(11)--将微服务注册进Eureka集群

前言&#xff1a;在上一章节中我们介绍并成功搭建了Eureka集群&#xff0c;本章节则介绍如何把微服务注册进Eureka集群&#xff0c;使服务达到高可用的目的 Eureka架构原理图 1、分别修改consumer-order80模块和provider-payment8001模块的application.yml文件&#xff0c;使这…

spring boot 基础案例【1】在页面上打印hellow world

1.在页面上打印hellow world 要在 Spring Boot 中打印 “Hello World” 并理解其代码&#xff0c;你可以创建一个简单的 Spring Boot 应用。这里&#xff0c;我将展示一个基本的示例并逐行解释代码的功能。 1.1 创建 Spring Boot 应用 首先&#xff0c;确保你已经安装了 Jav…

[vite] ts写配置根目录别名

参考:配置 Vite | Vite 写对象的形式吧 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],resolve: {alias: {"": path.resolve(__dirname…

MySQL的root用户无法远程连接

默认root用户只允许本地连接&#xff0c;所以需要修改mysql库中user表中名为root的用户的host为“%” select Host,User from user;UPDATE mysql.user SET host % WHERE user root; FLUSH PRIVILEGES;

JAVA:Kettle 强大的开源ETL工具

请关注微信公众号&#xff1a;拾荒的小海螺 1、简述 Kettle&#xff08;Pentaho Data Integration&#xff09;&#xff1a;强大的开源ETL工具Kettle&#xff0c;又称作Pentaho Data Integration&#xff0c;是一款流行的开源ETL&#xff08;Extract, Transform, Load&#x…

字符长、看不懂、费率飙升|Runes协议上线后发生了什么?

作者&#xff1a;比特里里 X/推&#xff1a;lilyanna_btc 1、字符数长了&#xff0c;单词都完整了&#xff0c;反而看不懂了 由于 Runes 协议的字符长度限制&#xff0c;大部分的票都在 13 个字符及以上&#xff0c;人名、域名、slogan&#xff0c;各类玩法都出来了。很多人适…

情感识别——情感计算的模型和数据集调查

概述 情感计算指的是识别人类情感、情绪和感觉的工作&#xff0c;已经成为语言学、社会学、心理学、计算机科学和生理学等领域大量研究的主题。 本文将概述情感计算的重要性&#xff0c;涵盖思想、概念和方法。 情感计算是皮卡德于 1997 年提出的一个想法&#xff0c;此后出…

线性模型算法

简介 本文章介绍机器学习中的线性模型有关内容&#xff0c;我将尽可能做到详细得介绍线性模型的所有相关内容 前置 什么是回归 回归的就是整合&#xff0b;预测 回归处理的问题可以预测&#xff1a; 预测房价 销售额的预测 设定贷款额度 可以根据事物的相关特征预测出对…

什么是关键字驱动测试?关键字驱动测试是如何实现的?

什么是关键字驱动测试&#xff1f; 关键字驱动测试 &#xff08;KDT&#xff09; 是测试自动化中的一种脚本技术&#xff0c;其中测试用例指令与实际测试脚本逻辑分开。它利用一组预定义的关键字来表示要在被测应用程序 &#xff08;AUT&#xff09; 上执行的操作。这些关键字…

spring boot的项目+nginx,怎么预防XSS攻击

在一个结合了Spring Boot和Nginx的项目架构中&#xff0c;防御跨站脚本攻击&#xff08;XSS&#xff09;需要在两个层面上进行综合防护&#xff1a;应用层&#xff08;Spring Boot应用&#xff09;和服务器层&#xff08;Nginx&#xff09;。这里是一些具体的策略和步骤&#x…

【C++风云录】地理信息处理与可视化:开源工具助力地理科学发展

构建智慧地图的利器&#xff1a;地理信息系统与地图可视化技术综述 前言 地理信息系统&#xff08;Geographic Information System&#xff0c;简称GIS&#xff09;和地图可视化技术是现代地理科学以及相关领域研究的重要工具和方法。本文将介绍几个常用的地理信息处理和地图…

BBS前后端混合项目--03

展示 static/bootstrp # bootstrap.min.css /*!* Bootstrap v3.4.1 (https://getbootstrap.com/)* Copyright 2011-2019 Twitter, Inc.* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)*//*! normalize.css v3.0.3 | MIT License | github.com/n…

XiaodiSec day021 Learn Note 小迪安全学习笔记

XiaodiSec day021 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 javaweb 2024.01.30 0:11 知识点 javaWeb 相关 JWT 越权 开始 知识点 1 webgoat 在 github 中 8.22 版本 不会全讲&#xff0c;只是挑一部分 path traversal 第二关 上传到指定位…