差分操作正确性证明

news/2025/10/15 23:09:52/文章来源:https://www.cnblogs.com/Atserckcn/p/19144484

差分操作正确性证明

本文是作者因题目写差分写挂了后随手总结的。

定义

对于一个长度为 \(n\) 的数组 \(a\),定义其差分数组为 \(p\),且 \(\forall 1\le i\le n,p_i=a_i-a_{i-1}(a_0=0)\)

转化回原数列

给些式子就懂了。

根据定义:

\[p_1+p_2+p_3+\cdots +p_k\\ =a_1+(a_2-a_1)+(a_3-a_2)+\cdots +(a_k-a_{k-1})\\ =a_k \]

所以,\(a_k=\sum_{i=1}^k p_i\)

\[a_k=\sum_{i=1}^k p_i\\ a_k=\sum_{i=1}^{k-1}p_i+p_k\\ a_k=a_{k-1}+p_k \]

另一种:

\[p_x=a_x-a_{x-1}\\ a_x=a_{x-1}+p_x \]

所以只要把 \(p\) 数组当作新的原数组,再将这个数组做个前缀和就 OK 了。

区间加法

假设需要将原数列的 \([l,r]\) 全部加上 \(v\)。那么暴力是 \(O(n)\) 的,考虑用差分优化。

公式:\(p_l\gets p_l+v,p_{r+1}\gets p_{r+1}-v\)

证明:

显然 \(\forall 1\le i\le l-1\)\(p_i\) 是不变的。那么考虑转化的本质。

我们设 \(s_i\) 表示修改后的数组。即 \(s_i=s_{i-1}+p_i\)

\[\forall l\le i\le r\\ s_i=\sum_{j=1}^{i}p_j\\ s_i=\sum_{j=1}^{i-1}p_j+p_i\\ s_i=s_{i-1}+p_j \]

那么在 \([l,r]\) 区间里的数,在前缀和时就会被 \(s_l\) 加上 \(v\)。而 \([r+1,n]\) 里的数(不动的),则在 \(s_{r+1}\) 时减回来了,故值不变。

差分大概也就用到这些,再复杂点的就用线段树吧。

例题

给道例题:NOIP 2012 提高组 借教室。

代码:(差分+二分,时间复杂度 \(O(n\log m)\)

#include<bits/stdc++.h>
using namespace std;
typedef long long ljl;
const int N=1e6+5;
int n,m;
ljl a[N],tp[N],sum[N],p[N];
struct R{int s,t;ljl d;
}r[N];
void addlr(int l,int r,int v)
{p[l]+=v;p[r+1]-=v;return;
}
bool check(int x)//check [1,x]
{for(int i=1;i<=n;++i)p[i]=tp[i];for(int i=1;i<=x;++i)addlr(r[i].s,r[i].t,-r[i].d);memset(sum,0,sizeof(sum));for(int i=1;i<=n;++i)sum[i]=p[i]+sum[i-1];for(int i=1;i<=n;++i)if(sum[i]<0)return 0;return 1;
}
int main(){ios::sync_with_stdio(0);cin>>n>>m;for(int i=1;i<=n;++i)cin>>a[i];for(int i=1;i<=m;++i)cin>>r[i].d>>r[i].s>>r[i].t;for(int i=1;i<=n;++i)tp[i]=a[i]-a[i-1];int l=0,r=m,mid=0;while(l<r){mid=(l+r+1)>>1;
//		cout<<l<<' '<<r<<' '<<mid<<' '<<check(mid)<<'\n';if(check(mid))l=mid;else r=mid-1;}if(l==m){cout<<"0\n";return 0;}cout<<"-1\n"<<l+1<<'\n';return 0;
}

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

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

相关文章

ansible安装脚本

ansible安装脚本#!/usr/bin/env bash # # 通用 Ansible 安装脚本 # 支持多种方式安装(yum/apt/pip/source) # 支持 root 和 普通用户 # 支持自定义版本(默认 2.9.27)set -eANSIBLE_VERSION=${1:-2.9.27} # 默认…

详细介绍:【笔记】介绍 WPF XAML 中 Binding 的 StringFormat详细功能

详细介绍:【笔记】介绍 WPF XAML 中 Binding 的 StringFormat详细功能pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

CF2143D2

给定长度为 \(n(n \le 2000)\) 的序列 \(a\),询问有多少个子序列满足不存在长度 \(\ge 3\) 的下降子序列。 显然可以 DP,令 \(dp_{i, j, k}\) 表示前 \(i\) 个数组成的子序列,最大值为 \(j\),长度为 \(2\) 的下降…

结果(Results)和结论 (Conclusion)的联系与区别

学术论文中结果(Results)和结论 (Conclusion)的联系与区别维度 结果 (Results) 结论 (Conclusion)联系 结论基于结果。结论必须以结果的客观发现为基础,不能无中生有。区别 事实呈现,描述“是什么”(What)。 事实的…

【训练技巧】PyTorch多卡训练模型DistributedDataParallel和DataParallel设置方法详解及分布式训练命令解释 - 实践

【训练技巧】PyTorch多卡训练模型DistributedDataParallel和DataParallel设置方法详解及分布式训练命令解释 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; …

20251015

今天上了离散数学课,然后收获了非常多的知识,接着又上了马克思原理课,今天总结下来就是非常的收获,然后中午经过一个舒爽的午睡以后,直接完成英语作业,读了单词剪辑了视频作业,非常的满意,然后还写了算法与数据…

java date 初始化指定时分秒及比较日期大小

java date 初始化指定时分秒及比较日期大小java date 初始化指定时分秒及比较日期大小Date now = new Date();/*** 注意:使用new Date(year, month, date)构造方法时,年份是绝对的年份(比如1999),月份是从0开始的…

软件工程学习日志2025.10.15

今日核心成果 完成了EIMS系统三大核心窗口的视觉统一与体验优化,实现了从"功能可用"到"体验优雅"的重要跨越。 ✨ 界面焕新:细节中的专业感全局视觉语言统一• 字体系统:全平台采用Microsoft Y…

实用指南:玳瑁的嵌入式日记---0929(ARM--ADC)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

C++篇:007

C++篇:007$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");C++篇:007.C++20常用新特性 一、模块 模块是一个用于在翻译单元间分享声明和定义的语言特性。它…

C++篇:006

C++篇:006$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");C++篇:006.C++17常用新特性 一、折叠表达式 C++17中引入了折叠表达式,主要是为了方便模板编程,…

C++篇:005

C++篇:005$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");C++篇:005.C++11常用新特性 一、auto 在新标准中,auto的功能变为类型推断,通知编译器去根据初…

C++篇:004

C++篇:004$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");C++篇:004.综合案例 基于字符串的IO操作 1.iostream istream 读取 ostream 写入 iostream 读写 …

轻量级ChatGPT克隆版nanochat技术解析

某知名AI研究员发布开源项目nanochat,提供完整的ChatGPT风格模型训练与推理流程。该项目包含8000行代码,涵盖分词器训练、Transformer预训练、监督微调及强化学习等关键技术环节。轻量级ChatGPT克隆版nanochat技术解…

10.15 —— 2020icpc上海D

临近一个月得知区域赛有了名额,可能也不算是好消息,大概率会延续去年打铁的经历。但不管怎样,我都会全力以赴,就算失败,我也会坦然地告诉自己尽力了,没有什么遗憾。 紧急进行一个小规划:争取每天练一道铁铜牌区…

[QOJ888] Travel around China 题解

存在[QOJ888] Travel around China 题解Petrozavodsk Winter 2021. Day 4. PKU Contest (Common Contest 1)考虑 \(n = 2\),猫树分治,考虑统计所有经过 \(mid\) 的区间,从 \(mid\) 开始跑最短路,处理出区间左右端点…

MySQL面试必考:从入门到精通的20个问题

低级难度问题问题:MySQL和SQL Server有什么区别? 答案:MySQL是一个开源的关系数据库管理系统,而SQL Server是微软开发的一个商业数据库管理系统。它们在性能、安全性、功能和成本方面有所不同。 案例: -- MySQL 分…

手撕大模型 | MQA 和 GQA 原理解析

一、前言 大模型(参数规模通常数十亿至万亿级)在处理复杂任务时面临三大核心问题:显式关联的局限性:传统 Multi-head Attention 依赖输入数据的显式特征(如文本中的词向量、图像中的像素特征)计算注意力,难以捕…

实用指南:CTFHub RCE通关笔记9:命令注入 过滤目录分隔符(3种方法渗透)

实用指南:CTFHub RCE通关笔记9:命令注入 过滤目录分隔符(3种方法渗透)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family…

P1912 [NOI2009] 诗人小G 分析

题目链接:P1912 [NOI2009] 诗人小G 题目概述 给你几个字符串,你可以按照给定的顺序任意拼接(你可以分组),但是拼接的时候中间要打空格,设这个当前的拼接长度为 \(sum\),那么代价为 \(|sum-L|^P\),求最小的代价…