差分原理+练习

差分的原理和前缀和相似,我们先联想一下前缀和。

前缀和计算下标从0到n的和,记为sum[n+1];如果想要求出[l,r]区间的和,可以快速的通过sum[r+1]-sum[l]来得到 。

前缀和适用于需要多次获取指定连续区间和的情景

差分即计算相邻两个元素的差,记为sub[i]=a[i]-a[i-1](sub[0]=a[0])。为什么要这样做呢?

如果我们对一段连续的区间的数进行同加或同减,那么区间内的sub数组是不会变化的,只有区间分界处的sub数组会发生变化

比如下面的数组:{1,2,3,4,5}

下标01234
a12345
sub11111

现在我们让[1,3]区间,也即2,3,4这三个数都加1,那么下面表格就更改为:

下标01234
a13455
sub12110

最终的效果是sub[1]+=1,sub[4]-=1;

于是有下面的结论:

对于差分数组,如果对原数组a的区间[l,r]同加c(c是个常数,也可以是负的),差分数组sub[l]+=c;sub[r+1]-=c;

而如果我们想还原原数组,通过差分数组也很方便,即对差分数组进行累加求和:

a[i]为下标从[0,i]的差分数组sub之和。

差分数组适用于多次对连续区间进行同加同减操作的情景

以下是两道练习题:

码蹄集 (matiji.net)

本题提到可在区间[l,r]对工资进行修改,完美符合差分的要求。

以下代码可以求出题目所需的差分数组,因为本题编号从1开始,所以本代码下标也是从1开始的,请注意

int n;
cin >> n;
//a是工资数组
for (int i = 1; i <= n; i++)cin >> a[i];
//sub是差分数组
//计算差分
sub[1] = a[1];
for (int i = 2; i <= n; i++) {sub[i] = a[i] - a[i - 1];
}

现在问题是如何解决题目的问题。

以样例为例,进行分析(本题所指的差分数组不涉及sub[1])

下标12345
a43234
sub本题中不重要-1-111

观察sub数组,题目提到一次操作可以使区间内的所有a都加1或减1,也即通过一次对[l,r]的操作,可以让sub[l]+=1且sub[r+1]-=1(也可能反之)

最终的目的是让所有人工资一样,即sub数组全为0(sub[1]除外)

眼神观察发现,可以操作[3,3]区间和[2,4]区间,让sub[3]+=1,sub[4]-=1;sub[2]+=1,sub[5]-=1,这样就达到sub数组全0的要求了。

实际上,一次操作能让sub数组里的一个数+1,让另一个数-1。设sub数组的所有正数和为P,负数和为-N(即绝对值为N);至少进行P次操作,所有的正数才能都归0;至少进行N次操作,所有的负数才能都归0。而我们可以通过操作让正数-1的同时负数也+1。这样也符合所谓的最少操作次数的要求

比如sub数组里的正数总和为6,负数总和为-4,那么经过4次操作,最后正数总和为2,负数总和为0,这种情况比如:{2,2,2,3,4}这时候再操作两次,就可以让sub数组的元素归0(sub[1]除外)(实际上最后的操作让sub[1]+=1,但是sub[1]在本题无意义,它不能反应工资是否相同)

所以,最少的操作数就是max(P,N),即正负数总和的绝对值中的最大值

以下是完整代码:

#include<iostream>
#include<vector>
using namespace std;
const int N = 1e5 + 10;
int a[N], sub[N];int main() {int n;cin >> n;//a是工资数组for (int i = 1; i <= n; i++)cin >> a[i];//sub是差分数组sub[1] = a[1];//这句话也可以不要,因为在本题sub[1]用不到int pos = 0, neg = 0;//pos记录差分数组正数和,neg记录负数和for (int i = 2; i <= n; i++) {//从2开始sub[i] = a[i] - a[i - 1];if (sub[i] > 0) pos += sub[i];else neg += sub[i];}cout << max(pos, -neg);//取绝对值最大的那个return 0;
}

下一题

码蹄集 (matiji.net)

(讲解时本题下标依然从1开始,请注意)

我们观察最后一组数据:2 4,可以看到第三匹马高度减少了1.

可以根据题目意思归纳,如果输入是[a,b],那么[a+1,b-1]区间的马匹的高度就会减一(初始值是最高的马高h)。

本题也是明显的连续对区间进行操作,刚好适合差分。

本题难度不高,下面直接给出代码:

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
//sub是差分数组
//本题可以省略高度数组
int n, h, f, sub[N] = { 0 };//差分数组先初始化为0,即默认一开始所有马的高度都是最高高度
int main()
{cin >> n >> h >> f;//根据前面讲的差分数组的原理,sub[1]=a[1],也即初始高度sub[1] = h;for (int i = 1; i <= f; i++) {int a, b;cin >> a >> b;//保证a<bif (a == b) continue;if (a > b) swap(a, b);//根据刚刚的分析,真正修改的区间是[a+1,b-1],对应需要修改的差分数组是sub[a+1]和sub[b](可对照开头的原理去理解)//注意sub[a+1]是减1,因为对整个区间的操作是高度减1,sub[b]是加1sub[a + 1] -= 1; sub[b] += 1;}//接下来根据差分数组还原原数组的方法,输出每匹马的高度//具体还原方法开头的原理也有,就是差分数组求和int height = 0;for (int i = 1; i <= n; i++) {//height是从1到i——[1,i]区间的差分数组之和//对应的就是a[i]的值height += sub[i];cout << height << endl;}return 0;
}

本文到此就结束了o(* ̄▽ ̄*)ブ 

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

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

相关文章

搜索与图论:树的重心

搜索与图论&#xff1a;树的重心 题目描述参考代码 题目描述 输入样例 9 1 2 1 7 1 4 2 8 2 5 4 3 3 9 4 6输出样例 4参考代码 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 100010, M N * 2;int n, m…

在Vue中使用websocket的流程

在Vue中使用WebSocket的完整流程可以总结如下&#xff1a; 安装WebSocket库&#xff08;如果需要&#xff09; 如果你选择使用特定的Vue WebSocket库&#xff08;如vue-websocket&#xff09;&#xff0c;你可以通过npm进行安装。 npm install vue-websocket --save或者&#…

【VUE 具名插槽的应用】

具名插槽类似于提前将布局安排好&#xff0c;但内容为空&#xff0c;一旦有具体内容填充进来&#xff0c;可以很和谐的展示&#xff0c;不影响整体效果。&#x1f347; “举个&#x1f330;&#xff1a;系统里大部分页面的查询条件是相同的&#xff0c;所以需要封装一个公用的查…

【2024最新华为OD-C/D卷试题汇总】目录管理器 (200分) - 支持在线评测+三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 在线评测链接 目录管理器 (200分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

【Python Cookbook】S01E23 以不区分大小写的方式对文本做查找和替换 re.IGNORECASE

目录 问题解决方案讨论 问题 如果我们需要从一段字符串中以不区分大小写的方式做查找和替换&#xff0c;该怎么做&#xff1f; 解决方案 正则化模块 re 提供 re.IGNORECASE 标识从而实现以不区分大小写的方式做查找和替换。 查找 re.findall() import retext "UPPER…

如何在QGIS中加载高清卫星影像?

我们在《如何在GlobalMapper中加载高清卫星影像》一文中&#xff0c;分享了在GlobalMapper中加载卫星影像的方法。 这里再为你分享如何在QGIS中加载高清卫星影像的方法&#xff0c;并可以在文末查看领取软件安装包和图源的方法。 如何加载高清图源&#xff1f; 要在QGIS中在…

接口签名和postman预处理生成签名

nestjs后端代码 controller Get(md5hmacSHA1b64)postMd5hmacSHA1b64(Req() request: Request, Query() query) {// 获取GET请求参数const queryParamsMap new Map(Object.entries(query));return this.handleMd5hmacSHA1b64(queryParamsMap, request);}Post(md5hmacSHA1b64)U…

单点登录(SSO)前端怎么做

单点登录&#xff08;SSO&#xff09;前端怎么做 本文介绍单点登录&#xff08;SSO&#xff09;是什么&#xff0c;还有就是前端怎么做。 单点登录&#xff08;SSO&#xff09;是什么 单点登录&#xff08;SSO&#xff0c;Single Sign On&#xff09;&#xff0c;是在企业内部…

【再探】Java—Java 沙箱机制与类加载器

沙箱&#xff08;Sandbox&#xff09;机制是将Java程序限定在JVM特定的运行范围内&#xff0c;并严格限制代码对本地系统资源的访问&#xff0c;以保证代码的有效隔离&#xff0c;防止对本地系统造成破坏。 1 安全模型 类在加载过程中&#xff0c;类加载器会为类设置初始的安…

PyQt5中按钮长按指定时间后松开触发(鼠标事件)

背景&#xff1a;为了节约人力测试成本&#xff0c;模拟鼠标长按后松开&#xff0c;整理了这个简单的小demo 1、关键方法 实例鼠标按下事件 QMouseEvent(QEvent.MouseButtonPress, self.p_pos, Qt.MouseButton.LeftButton, Qt.MouseButton.LeftButton, Qt.NoModifier)实例…

常见的项目模块以及项目流程

1.图片轮播功能咋测的 接口&#xff0c;功能&#xff0c;影响面&#xff0c;性能&#xff0c;新旧数据兼容性测试 第一&#xff0c;测试环境查看旧数据功能是否正常&#xff0c;新增图片轮播是否正常&#xff0c;第二&#xff0c;自己写一个数据库数据迁移脚本将老数据迁移到…

gstreamer+mpp调用硬解码播放视频

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、cpu解码二、gstreamermpp1.默认已安装2.没安装必要软件 总结 前言 以前一直在MPP上开发硬解码推理&#xff0c;最近想弄一个盒子支持调用mpp硬解码播放视频…

跑图像生成模型GAN时,遇到OSError: cannot open resource 报错解决办法

报错信息如下&#xff1a; Traceback (most recent call last): File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py", line 276, in <module> count train(dataloader, image_encoder, text_encoder, File "/root/autodl-tmp/ssa-gan/pretrain_DAMSM.py…

QT Creator与QT的下载安装

0.起因/小结&#xff1a; 因为运行项目需要更高版本的QT。 下载了QT 6.2.0&#xff0c;但是里面的gcc&#xff0c;g&#xff0c;gdb是64bit的&#xff0c;而我的QT Creator是32bit的&#xff0c;所以又下载了QT 13.0.0的64bit版本。 遇到问题&#xff1a;msvcp140_1.dll找不到…

软件管理及部分命令

sed命令 格式&#xff1a; sed [选项] 操作 目标文件 选项&#xff1a; -i&#xff1a;修改原始文件【如果不加-i&#xff0c;那就是仅仅修改内存中的文件副本】 案例&#xff1a;将1.txt中的tom修改成jerry。 sed -i "s/tom/jerry/g" 1.txt 将1…

基于FPGA的任意点滑动平均(滑动窗长度和数据位宽参数化,例化时参数可设置)

目录 1.前言2.原理3.举例说明4.Matlab实现5.FPGA实现滑动平均 微信公众号获取更多FPGA相关源码&#xff1a; 1.前言 对于一维信号&#xff0c;我们可以使用类似移动平均滤波&#xff08;Moving Average Filtering&#xff09;实现denoising。Moving Average Filtering 是一种…

vue-router 源码分析——3. 动态路由匹配

这是对vue-router 3 版本的源码分析。 本次分析会按以下方法进行&#xff1a; 按官网的使用文档顺序&#xff0c;围绕着某一功能点进行分析。这样不仅能学习优秀的项目源码&#xff0c;更能加深对项目的某个功能是如何实现的理解。这个对自己的技能提升&#xff0c;甚至面试时…

Jmeter性能分析及调优详解(入门)

一、系统性能理解 如果说需求、开发、DB、运维、测试是单一一门学科&#xff0c;那么性能就是综合学科&#xff0c;它包含了需求分析、DB、开发、测试、运维的所有学科。其实一般来说在实际性能分析和调优中&#xff0c;测试担任的角色就是写压测脚本并执行脚本查看结果&#…

TPM 是什么?如何查看电脑的 TPM?

TPM 是什么&#xff1f; 首先我们来了解一下 TPM 是什么&#xff0c;TPM 由可信计算组织&#xff08;Trusted Computing Group&#xff0c;TCG&#xff09;开发&#xff0c;为了在提高计算机系统的安全性。随着网络安全威胁的不断增加&#xff0c;TPM 技术逐渐成为确保系统安全…