差分原理+练习

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

前缀和计算下标从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<b
        if (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]是加1
        sub[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.mfbz.cn/a/685425.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pESC-HIS是什么,怎么看?-实验操作系列-2

01 典型的pESC-HIS质粒遗传图谱 02 介绍 质粒类型&#xff1a;酿酒酵母蛋白表达载体 表达水平&#xff1a;高拷贝 诱导方法&#xff1a;半乳糖 启动子&#xff1a;GAL1和GAL10 克隆方法&#xff1a;多克隆位点&#xff0c;限制性内切酶 载体大小&#xff1a;6706bp 5 测…

Ubuntu系统中Apache Web服务器的配置与实战

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

当高考遇上端午假期

端午就要到了&#xff0c;碰巧遇上高考&#xff0c;那就假期回家&#xff0c;给学子们让路。一家人在一起&#xff0c;陪着长辈&#xff0c;吃个香甜的粽子&#xff0c;话个家常&#xff0c;也教长辈这两个功能&#xff0c;何尝不是一种幸福 华为畅享70S伴你温情相聚。 长辈关…

RTA_OS基础功能讲解 2.8-Tick计数器

RTA_OS基础功能讲解 2.8-Tick计数器 文章目录 RTA_OS基础功能讲解 2.8-Tick计数器一、计数器简介二、计数器配置三、计数器驱动3.1 软件计数器驱动3.1.1 递增软件计数器3.1.2 静态计数器接口3.2 硬件计数器驱动3.2.1 Advancing硬件计数器3.2.2 回调函数四、在运行时访问计数器属…

shell的编程方式

文章目录 变量俩种方式第一种方式第二种方式 取消变量数组创建数组获取数组元素的方式 read输出的方式限制输入的方式 流程控制方式for循环输出的方式第一种方式第二种方式while循环输出的方式select选择输出的方式 判断方式判断的四种方式第一种方式第二种方式第三种方式 算术…

springboot+vue+mybatis房屋租贷系统+PPT+论文+讲解+售后

本论文系统地描绘了整个网上房屋租赁系统的设计与实现&#xff0c;主要实现的功能有以下几点&#xff1a;管理员&#xff1b;首页、个人中心、房屋类型管理、房屋租赁管理、会员管理、订单信息管理、合同信息管理、退房评价管理、管理员管理&#xff0c;系统管理&#xff0c;前…

parseInt函数

貌似遇到问题了&#xff0c;在Java中&#xff0c;parseInt方法是java.lang.Integer类的一个静态方法&#xff0c;它用来将字符串转换为基本数据类型int。如果字符串不能被解析为有效的整数&#xff0c;parseInt会抛出一个NumberFormatException。 原来是取整串转换&#xff0c;…

行心科技|中科利众:健康科技新合作,营养与科技融合前行

2024中国国际大健康产业文化节暨第34届国际大健康产业交易博览会于2024年5月31日在保利世贸博览馆盛大开幕&#xff0c;行心科技与中科利众&#xff08;贵州&#xff09;生物科技有限公司不谋而合&#xff0c;就“膳食机能健康问题解决方案”达成战略合作&#xff0c;共同开启膳…

Android——热点开关演讲稿

SoftAP打开与关闭 目录 1.三个名词的解释以及关系 Tethering——网络共享&#xff0c;WiFi热点、蓝牙、USB SoftAp——热点(无线接入点)&#xff0c;临时接入点 Hostapd——Hostapd是用于Linux系统的软件&#xff0c;&#xff0c;支持多种无线认证和加密协议&#xff0c;将任…

mmdetection的生物图像实例分割三:自定义数据集的测试与分析

mmdetection的生物图像实例分割全流程记录 第三章 自定义数据集的测试、重建与分析 文章目录 mmdetection的生物图像实例分割全流程记录前言一、测试集的推理1.模型测试2.测试数据解析 二、测试结果的数据整合三、生物结构的重建效果 前言 mmdetection是一个比较容易入门且上…

【Linux】Linux环境基础开发工具_5

文章目录 四、Linux环境基础开发工具Linux小程序---进度条git 未完待续 四、Linux环境基础开发工具 Linux小程序—进度条 上篇我们实现了一个简易的进度条&#xff0c;不过那仅仅是测试&#xff0c;接下来我们真正的正式实现一个进度条。 接着编写 processbar.c 文件 然…

java第二十课 —— 面向对象习题

类与对象练习题 编写类 A01&#xff0c;定义方法 max&#xff0c;实现求某个 double 数组的最大值&#xff0c;并返回。 public class Chapter7{public static void main(String[] args){A01 m new A01();double[] doubleArray null;Double res m.max(doubleArray);if(res !…

如何通俗易懂地理解大模型参数?

大型语言模型 (LLM) 的大小是通过参数数量来衡量的。举几个典型例子&#xff0c;GPT-3 有 1750 亿个参数&#xff0c;1750亿也可称为175B&#xff08;1B 10亿&#xff09;&#xff0c;Meta最新开源的Llama3 参数数量在 80 亿到 700 亿之间&#xff0c;智谱公司最新开源的GLM4-…

龙叔Linux:别名(alias)

在Linux中&#xff0c;别名&#xff08;alias&#xff09;是一个命令的简短形式&#xff0c;通常用于简化或替换更长的命令序列。你可以使用alias命令来创建、查看和删除别名&#xff0c;定制自己专属的命令。一、创建别名 1.1、临时创建 你可以使用alias命令在命令行中直接定…

【MySQL】数据库入门基础

文章目录 一、数据库的概念1. 什么是数据库2. 主流数据库3. mysql和mysqld的区别 二、MySQL基本使用1. 安装MySQL服务器在 CentOS 上安装 MySQL 服务器在 Ubuntu 上安装 MySQL 服务器验证安装 2. 服务器管理启动服务器查看服务器连接服务器停止服务器重启服务器 3. 服务器&…

web刷题记录(4)

[GKCTF 2020]cve版签到 进来应该是给了个提示了&#xff0c;就是要以.ctfhub.com结尾 还有一个超链接&#xff0c;这题的ssrf还是挺明显的&#xff0c;抓包看看 发现回显里面有提示 说是和本地有关&#xff0c;那么也就是说&#xff0c;要访问127.0.0.1&#xff0c;大概意思就…

搜索与图论:树的重心

搜索与图论&#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…

2024 Q1企业级SSD市场暴涨,国产努力追赶!

在2024年第一季度&#xff0c;由于对高容量存储需求的激增&#xff0c;企业级固态硬盘&#xff08;SSD&#xff09;市场的收入实现了显著增长&#xff0c;达到了37.58亿美元&#xff0c;与上一季度相比增长了62.9%。这一增长主要得益于供应商减产导致的高容量订单需求未得到满足…

【WP】猿人学_17_天杀的Http2.0

https://match.yuanrenxue.cn/match/17 抓包分析 居然对Fiddler有检测&#xff0c;不允许使用 那就使用浏览器抓包&#xff0c;好像没发现什么加密参数&#xff0c;然后重放也可以成功&#xff0c;时间长了也无需刷新页面&#xff0c;尝试Python复现。 Python复现 import …

SVM模型实现城镇居民月平均消费数据分类

SVM模型实现城镇居民月平均消费数据分类 一、SVM支持向量机简介二、数据集介绍三、SVM建模流程及分析一、SVM支持向量机简介 支持向量机是由感知机发展而来的机器学习算法,属于监督学习算法。支持向量机具有完备的理论基础,算法通过对样本进行求解,得到最大边距的超平面,并…