【ETOJ P1050】【模板】差分 题解(数学+差分+前缀和)

题目描述

给定一个长度为 n n n 的数组 a a a

m m m 次修改,每次修改让数组 a a a 在区间 [ l , r ] [l,r] [l,r] 增加 x x x

在修改完成后有 q q q 次询问,每次询问数组在区间 [ l , r ] [l,r] [l,r] 的和。

输入格式

  • 第一行一个整数 n n n ( 1 ≤ n ≤ 1 0 5 ) (1 ≤ n ≤ 10^5) (1n105)
  • 第二行 n n n 个整数表示数组 a a a ( − 1 0 9 ≤ a i ≤ 1 0 9 ) (-10^9 ≤ a_i ≤ 10^9) (109ai109)
  • 第三行一个整数 m m m ( 1 ≤ m ≤ 1 0 5 ) (1 ≤ m ≤ 10^5) (1m105)
  • 接下来 m m m 行,每行两个整数 l i , r i , x i l_i, r_i, x_i li,ri,xi ( 1 ≤ l i ≤ r i ≤ n , − 1 0 9 ≤ x ≤ 1 0 9 ) (1 ≤ l_i ≤ r_i ≤ n, -10^9 ≤ x ≤ 10^9) (1lirin,109x109)
  • 接下来一行一个整数 q q q ( 1 ≤ q ≤ 1 0 5 ) (1 ≤ q ≤ 10^5) (1q105)
  • 接下来 q q q 行,每行两个整数 l i , r i l_i, r_i li,ri ( 1 ≤ l i ≤ r i ≤ n ) (1 ≤ l_i ≤ r_i ≤ n) (1lirin)

输出格式

对于每一次询问,输出一个整数表示答案。

样例

输入样例 #1

5
1 1 1 1 1
2
1 3 1
2 5 -2
2
1 2
3 4

输出样例 #1

2
-1

思路

首先读入数组长度n,然后读入数组元素。在读入数组的同时,计算差分数组。差分数组的定义是,对于原数组的每个元素,差分数组的对应位置存储的是当前元素与前一个元素的差值。这样的话,对于原数组的连续区间的修改(加或减一个常数),就可以转化为对差分数组两个位置的修改。

然后,程序读入m次修改操作。每次修改操作指定一个区间[l, r]和一个值x,表示将原数组的这个区间内的所有元素都加上x。这个操作转化到差分数组上,就是将diff[l]加上x,将diff[r+1]减去x。

在所有修改操作完成后,根据差分数组重新计算原数组的值,同时计算前缀和数组。前缀和数组的定义是,对于原数组的每个元素,前缀和数组的对应位置存储的是原数组从第一个元素到当前元素的和。这样的话,原数组的任意区间和就可以通过前缀和数组的两个位置的差值来得到。

最后读入q次查询操作。每次查询操作指定一个区间[l, r],要求输出原数组这个区间内的所有元素的和。这个操作就是输出prefix[r] - prefix[l - 1]。


AC代码

#include <iostream>
#define ll long long
#define AUTHOR "HEX9CF"
using namespace std;const int N = 1e6 + 7;int n, m, q;
ll a[N];
ll diff[N];
ll prefix[N];int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);a[0] = 0;prefix[0] = 0;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];diff[i] = a[i] - a[i - 1];}cin >> m;while (m--) {int l, r, x;cin >> l >> r >> x;diff[l] += x;diff[r + 1] -= x;}for (int i = 1; i <= n; i++) {a[i] = a[i - 1] + diff[i];prefix[i] = prefix[i - 1] + a[i];}cin >> q;while (q--) {int l, r;cin >> l >> r;cout << prefix[r] - prefix[l - 1] << endl;}return 0;
}

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

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

相关文章

源码梳理(3)MybatisPlus启动流程

文章目录 1&#xff0c;MybatisPlus的使用示例2&#xff0c;BaseMapper方法的执行2,1 MybatisMapperProxy代理对象2.2 InvocationHandler接口&#xff08;JDK动态代理&#xff09;2.3 MapperMethodInvoker接口2.4 MybatisMapperMethod 3&#xff0c;SqlSession的执行流程3.1 Sq…

js基础(1)

操作数组 数组.push() 将一个或多个元素添加到数组末尾&#xff0c;返回数组新长度 数组.unshift() 将一个或多个元素添加到数组末尾&#xff0c;返回数组新长度 数组.pop() 删除最后一个元素&#xff0c;返回该元素的值 更灵活的删除方法&#xff0c;删除指定元素 数组.spli…

【MySQL题】——基础概念论述(一)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Github 2024-02-09 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-09统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4Go项目2Scala项目1PLpgSQL项目1Ruby项目1HTML项目1Solidity项目1Lua项目1 开源个人理财应用 Mayb…

如何连接ChatGPT?无需科学上网,使用官方GPT教程

随着AI的发展&#xff0c;ChatGPT也越来越强大了。 它可以帮你做你能想到的几乎任何事情&#xff0c;妥妥的生产力工具。 然而&#xff0c;对于许多国内的用户来说&#xff0c;并不能直接使用ChatGPT&#xff0c;不过没关系&#xff0c;我最近发现了一个可以直接免科学上网连…

【图形图像的C++ 实现 01/20】 2D 和 3D 贝塞尔曲线

目录 一、说明二、贝塞尔曲线特征三、模拟四、全部代码如下​五、资源和下载 一、说明 以下文章介绍了用 C 计算和绘制的贝塞尔曲线&#xff08;2D 和 3D&#xff09;。    贝塞尔曲线具有出色的数学能力来计算路径&#xff08;从起点到目的地点的曲线&#xff09;。曲线的形…

新版MQL语言程序设计:模板方法模式的原理、应用及代码实现

文章目录 一、什么是模板方法模式二、模板方法模式的实现原理三、模板方法模式的应用场景四、模板方法模式的代码实现 一、什么是模板方法模式 模板方法模式是一种行为设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;将一些步骤的实现延迟到子类中。在模板方法模式中&…

[145] 二叉树的后序遍历 js

题目描述&#xff1a;给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 解题思路&#xff1a; 迭代法&#xff1a; 后序&#xff08;左右根&#xff09; 先序是根左右 后序是左右根 后序翻转一下就是 根右左 所以后序的结果实际就是 先序的方法&#xff0…

Java汽车销售管理

技术架构&#xff1a; springboot mybatis Mysql5.7 vue2 npm node 有需要该项目的小伙伴可以私信我你的Q。 功能描述&#xff1a; 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能&#xff0c;提供经理和销售两种角色进行管理 效果图&…

医院挂号预约|医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)

医院挂号预约小程序目录 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;医院管理 &#xff08;3&#xff09;医生管理 &…

Cisco firepower2100系列使用FDM管理FTD

Cisco firepower2100系列使用FDM管理FTD 啥是FDM Firepower Device Manager 当思科Firepower系列运行的FTD镜像时&#xff0c;可以通过2种方式进行管理 第1种方式&#xff1a; FMC (Firepower management Center) 可以进行统一管理&#xff0c;一台FMC可以管理多个FTD&…

[office] 怎么在Excel2003菜单栏自定义一个选项卡 #其他#微信#知识分享

怎么在Excel2003菜单栏自定义一个选项卡 怎么在Excel2003菜单栏自定义一个选项卡 ①启动Excel2003&#xff0c;单击菜单栏--工具--自定义。 ②在自定义界面&#xff0c;我们单击命令标签&#xff0c;在类别中选择新菜单&#xff0c;鼠标左键按住新菜单&#xff0c;拖放到菜单栏…

设计模式巡礼:多板适配案例解析与深度重构

theme: cyanosis 月黑风高&#xff0c;好兄弟发给我一个重构需求&#xff0c;咨询我的意见。 一、 场景分析 开发的产品是需要运行到不同的定制Android板子&#xff0c;不同板子有对应的不同SDK提供的API&#xff0c;目前的业务端&#xff0c;业务流程基本是确定的&#xff0…

Python中HTTP隧道的基本原理与实现

HTTP隧道是一种允许客户端和服务器之间通过中间代理进行通信的技术。这种隧道技术允许代理服务器转发客户端和服务器之间的所有HTTP请求和响应&#xff0c;而不需要对请求或响应内容进行任何处理或解析。Python提供了强大的网络编程能力&#xff0c;可以使用标准库中的socket和…

单片机学习笔记---DS1302实时时钟工作原理

目录 DS1302介绍 学会读芯片手册&#xff08;DS1302芯片手册&#xff09; 封装 引脚定义 电源部分 时钟部分 通信部分 总结列表 内部结构图 电源控制部分 时钟控制部分 寄存器部分 访问部分 寄存器部分的详细定义 命令字 时序的定义 单字节读 单字节写 提前预…

flinksqlbug : AggregateFunction udf Could not extract a data type from

org.apache.flink.table.api.ValidationException: SQL validation failed. An error occurred in the type inference logic of function ‘default_catalog.default_database.CollectSetSort’. org.apache.flink.table.api.ValidationException: An error occurred in the t…

LC 1696. 跳跃游戏 VI

1696. 跳跃游戏 VI 难度 : 中等 题目大意: 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一开始你在下标 0 处。每一步&#xff0c;你最多可以往前跳 k 步&#xff0c;但你不能跳出数组的边界。也就是说&#xff0c;你可以从下标 i 跳到 [i 1&#xff0c; min(n…

【JAVA WEB】CSS

目录 CSS是什么&#xff1f; 基本语法规范 引入方式 内部样式表 行内样式表 外部样式表 常用选择器的种类 基础选择器 标签选择器 类选择器 id选择器 通配符选择器 复合选择器 后代选择器 伪类选择器 常用元素属性&#xff1a; 字体属性&#xff1a; 文本属性…

Sklearn、TensorFlow 与 Keras 机器学习实用指南第三版(一)

原文&#xff1a;Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 机器学习海啸 2006 年&#xff0c;Geoffrey Hinton 等人发表了一篇论文&#xff0c;展示了如何训练一个能够以最先进的精度…

OpenAI Altman的野心:筹资七万亿美元直指AI“芯片痛点”!

继推出突破性的AI产品ChatGPT之后&#xff0c;Sam Altman又欲筹集数万亿美元&#xff0c;重塑全球半导体产业格局。 据媒体周五报道&#xff0c;知情人士透露称&#xff0c;OpenAI CEO Sam Altman正在与包括阿联酋在内的投资者进行谈判&#xff0c;以筹集数万亿美元资金&#…