算法心得(3)**差分**

news/2025/3/13 9:50:50/文章来源:https://www.cnblogs.com/Travic/p/18767422

**思路**

差分可以简单的看成**序列中每个元素与其前一个元素的差**一般认为它相当于前缀和的   逆运算  

 

一般在情况满足两个条件时就使用它:(1)影响可以累加(2)有多个影响

差分序列的作用:快速一个序列中某个区间内的所有值同时加上或减去一个常数

拿给一维数组A来说:

定义一个操作(l,r,k),表示数组中对A[l]~A[r]区间上的每一个元素都加上k,如操作(3,6,2)使得数组A变成:

当有多个操作时,如果此时再对元素一个一个的加来加去,显然太慢了,并且有的操作还会有重叠,比如对数组A,分别进行操作(3,6,2),操作(4,7,-1):

可以看到A[4]、A[5]、A[6]被反复操作了两次。

使用差分可以优化重叠的部分。定义差分数组B:

B[1]=A[1],B[2]=A[2]-A[1],B[3]=A[3]-A[2].......B[n]=A[n]-A[n-1]   

注意得到:

B[1]+B[2]+B[3]+...+B[n]=A[n]  

有了上述关系,对于操作(l,r,k),只需要对差分数组B:

       B[l]+=k               

       B[r+1]-=k           

当操作很多的时候,就可以先算出差分数组,再用以上式子对差分数组修改,最后重新对修改过的差分数组进行累加便可得结果数组C。

**原理**

将结果C数组拆成[1,l-1]、[l,r]、[r+1,n]三个部分:

对于[1,l-1],因为B[1]到B[l-1]没有改变,所以该部分等于原来数组A的值。

对于[l,r]:

C[l]=B[l],因为B[1]+=k,所以C[1]=A[l]+k

C[l+1]=B[l]+B[l+1],因为B[1]+=k,所以C[l+1]=A[l+1]+k

.........

C[r]=B[l]+B[l+1]+B[l+2]+....+B[r],因为B[l]+=k,所以C[r]=A[r]+k

对于[r+1,n]:

C[r+1]=B[l]+B[l+1]+B[l+2]+....+B[r]+B[r+1],因为B[l]+=k,B[r+1]-=k,所以C[r+1]=A[r+1]

.........

C[n]=B[l]+B[l+1]+B[l+2]+....+B[r]+B[r+1]+....+B[n],因为B[l]+=k,B[r+1]-=k,所以C[n]=A[n]  

 

**思考**

差分与前缀和的区别是:前缀和记录的是影响,而差分处理的是被影响的对象。

那为什么说差分是前缀和的逆运算呢?

我们看一下对于一维数组什么时候使用前缀和:

设查询[l,r]为计算一维数组A中A[l]~A[r]的值的总和,那么我们可以使用前缀和数组D:

D[1]=A[1]

D[2]=D[1]+A[2]=A[1]+A[2]

D[3]=D[2]+A[3]=A[1]+A[2]+A[3]

D[4]=D[3]+A[4]=A[1]+A[2]+A[3]+A[4]

..........

D[n]=D[n-1]+A[n]=A[1]+A[2]+A[3]+........+A[n]      

所以   查询[l,r]=D[r]-D[l-1]

可以看到前缀和是先加后减,差分是先减后加。这时候我们再使用一个数组E,用来保存我们之前得到的差分数组B的前缀和:

E[1]=B[1],E[2]=B[2]-B[1],E[3]=B[3]-B[2].......E[n]=B[n]-B[n-1]   

进行一些数学运算用来比较:

A[n]-A[n-1] =B[n]

       =E[n]-E[n-1]

A[r]-A[l-1]=A[r]-A[r-1]+A[r-1]-A[r-2]+A[r-2]-A[r-3]+......+A[l]-A[l-1]

       =B[r]+B[r-1]+B[r-2]+......+B[l]

       =E[r]-E[l-1]

可以看到数组A与数组E等效!!!

  相当于:A差分得到B,B前缀和得到A  

 

由此可以看出两者的逆运算关系

**例题**

第25次CSP认证考试中的第二题,“出行计划”:

虽然这道题用到了差分,但是我认为最关键的技巧不在于差分算法,而在于数据结构。

我们用一个数组A用来保存可以进入的场所数量,其下标为时间,其值为在该时间能进入的场所数量。比如A[1]=2,表示在核酸得出的时间t=1时,能够进入2个场所。

要在ti时间到达一个地方,并且该地方还要你出示ci时间内的健康码,那我们的健康码出来的时间最早应会在ti-ci+1,为什么+1呢,这是题目规定的,健康码的有效期是pi+k到pi+k+23,相当于从0开始计时。

所以对于一个计划(ti,ci),我们对于数组A的操作,应该让A[ti-ci+1]~A[ti]之内的值都+1。这时候就可以使用差分了。

通过差分快速获得数组A后,便可以根据查询的时间q和核酸时间k,直接输出A[q+k]即可。

一个题解代码:

#include <bits/stdc++.h>
#define LL long long
#define N 1000005
using namespace std;
int n, m, k, ans, x;
int t[N], c[N];
int A[N]; // 结果数组(差分求和数组
int B[N]; // 差分数组
int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n >> m >> k;for (int i = 1; i <= n; i++) // 注意下标的起始{cin >> t[i] >> c[i];B[max(1, t[i] - c[i] + 1)]++; // 时间不能小于1B[t[i] + 1]--;}for (int i = 1; i <= t[n]; i++){A[i] += B[i]; // 对差分数组求和}while (m--){cin >> x;if (x + k > t[n]) // 如果核酸出结果时间比我们最后一次到地方的时间还晚,就输出0,根本不能去任何一个地方cout << 0 << endl;elsecout << A[x + k] << endl; // 输出对应数组元素}return 0;
}

 

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

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

相关文章

NocoBase v1.6.0 正式版发布

集群模式部署、安全策略优化 和 迁移管理,性能、安全性和用户体验的全面提升原文链接:https://www.nocobase.com/cn/blog/nocobase-1-6-0 新特性 集群模式 企业版可通过相关插件支持集群模式部署,应用以集群模式运行时,可以通过多个实例和使用多核模式来提高应用的对并发访…

TypeScript 为什么使用 Go 而不是 Rust 重写 ?官方回应来了

TypeScript官推最近宣布他们正在移植到 Go,速度已经提高了 10 倍之多。 作为以性能为代表的另一语言Rust,人们自然会疑惑为什么没有选Rust语言重构呢?为方便大家快速理解,我用DeepSeek用小红书的语气重新总结了下:(原文放在下方,大家可以继续往下阅读)✨【技术选型大实…

什么情况,今年面试都不问八股文了??准备了几个月,结果一个都不问。。

大家好,我是R哥。 你还在死背八股文? 有好几个兄弟和我说,说背了几个月的八股文,结果面试官一个都不问,全问项目,结果面试被暴击了。 比如这位准备报名我的面试辅导的兄弟:还有这位报了我面试辅导的兄弟也是,全程项目拷打,都没问八股文:什么情况,现在面试都不问八股…

Hyper V用法实践:虚拟机备份与恢复技巧

在使用Hyper-V管理虚拟机时,掌握虚拟机备份与恢复技巧至关重要,这有助于确保业务连续性和数据安全。以下是一些实践中的虚拟机备份与恢复技巧:一、备份技巧 使用Hyper-V管理器导出虚拟机 打开Hyper-V管理器,选择要备份的虚拟机。 右键点击虚拟机,选择“导出”。 在导出窗口…

CorelDRAW Graphics Suite 2025 v26.0 (macOS, Windows) - 矢量图形设计软件

CorelDRAW Graphics Suite 2025 v26.0 (macOS, Windows) - 矢量图形设计软件CorelDRAW Graphics Suite 2025 v26.0 (macOS, Windows) - 矢量图形设计软件 vector illustration, layout, photo editing, and typography 请访问原文链接:https://sysin.org/blog/coreldraw/ 查看…

如何告别供应商图纸外发泄密风险,开启安全传输通道?

在当今竞争激烈的商业环境中,供应商图纸外发已成为企业合作与生产过程中不可或缺的环节。然而,这一环节却隐藏着诸多安全风险,一旦忽视,可能会给企业带来毁灭性的打击。图纸作为企业核心技术和商业秘密的重要载体,包含着产品的设计理念、技术参数、工艺流程等关键信息。这…

20242942 2024-202-2 《网络攻防实践》第二次作业

一、实验内容 1.网络踩点 攻击者通过公开或半公开的渠道收集目标网络的基本信息。这一阶段的目标是尽可能多地了解目标网络的结构、范围和潜在漏洞,而不会直接与目标系统交互。目的是确定目标网络的IP地址范围;了解目标网络的域名和子域名以及获取目标组织的网络拓扑结构。  …

【一文解读】研发网与办公网跨网文件传输难题如何破解?

一、研发网与办公网跨网文件传输的挑战与需求 在现代企业中,研发网与办公网的分离设计是为了保障信息安全、控制网络访问、提高数据的保密性等方面的考虑。研发网(通常用于技术开发、测试、实验等敏感工作)与办公网(用于日常办公和互联网访问)在企业内部通常是两个相对独立…

H德菲尔monyOS Next 入门实战 - 文字转拼音,文字转语音

pinyin4js 提供了以下接口:● 文字转拼音(带声调和不带声调)● 文字转拼音首字母● 简体繁体互转 let rawText = "风急天高猿萧哀,渚清沙白鸟飞回;" let pinyin1: string =pinyin4js.convertToPinyinString(rawText, " ", pinyin4js.WITH_TONE_MARK) …

吐血整理!2025 最好用 AI 工具全汇总,别再瞎找了!

在当下这个 AI 蓬勃发展的时代,各类 AI 工具如雨后春笋般涌现,让人眼花缭乱。无论是职场人士想要提升工作效率,还是创作者渴望激发灵感、优化内容,亦或是学生期望找到学习的得力助手,都在苦苦寻觅真正好用、实用的 AI 工具。 AI工具太多,是好事也是坏事,特别是当面临选择…

公司明令禁止使用Xshell。因此,我花了一些时间,

今天这篇文章轻松不烧脑,主要是想和大家分享一下我在工作中常用的远程管理工具——MobaXterm。这款工具不仅功能强大,而且在日常的远程操作中极为高效,特别适合用来管理远程服务器。MobaXterm结合了多种网络工具,支持SSH、X11、RDP等协议,能够通过图形界面连接不同的远程系…

DeepSeek 十大提问公式 | AI 通用

AI 辅助教学案例 03,收集整理并记录现有的比较火爆的国产 AI 在教育教学中的使用案例,以期和各位同仁、莘莘学子共同进步。[第三期]前情概要 DeepSeek 十大提问公式