当前位置: 首页 > news >正文

差分(附带例题题解)

什么是差分

差分数组的核心思想是 记录相邻元素的差值,而不是直接存储原始数据。通过维护差分数组,我们可以高效地实现区间增量操作。

1.1 差分数组的定义

给定原数组 a[1..N],其差分数组 diff[1..N] 定义为:

  • diff[1] = a[1]
  • diff[i] = a[i] - a[i-1] (i > 1

示例

  • 原数组:a = [1, 3, 5, 7, 9]
  • 差分数组:diff = [1, 2, 2, 2, 2]

1.2 差分数组的作用

差分数组可以快速还原原数组:

  • a[1] = diff[1]
  • a[i] = a[i-1] + diff[i] (i > 1

更重要的是,差分数组支持 O(1) 时间的区间增量操作


2. 区间增量操作

假设我们需要对原数组的区间 [L, R] 中的所有元素加上 val,即:

  • a[L] += val
  • a[L+1] += val
  • ...
  • a[R] += val

如果直接遍历修改,时间复杂度是 O(R - L + 1),最坏情况下是 O(N)

2.1 差分数组的优化方法

差分数组通过以下方式实现 O(1) 时间的区间增量:

  1. 在 L 处增加 valdiff[L] += val
  2. 在 R+1 处减少 val(如果 R+1 不越界):diff[R+1] -= val

为什么这样有效?

  • 差分数组的前缀和就是原数组,因此:
    • a[L] 会增加 val(因为 diff[L] 增加了 val)。
    • a[L+1..R] 也会增加 val(因为它们依赖于 a[L] 的累加)。
    • a[R+1] 不会受到影响(因为 diff[R+1] 减少了 val,抵消了前面的增量)。

例题

区间更新

link:1.区间更新 - 蓝桥云课

code

#include <bits/stdc++.h>
using namespace std;int n, m;
int a[100007], diff[100007];void init()
{for(int i = 1; i <= n; i++){diff[i] = a[i] - a[i - 1];}
}void fc(int x, int y, int z)
{diff[x] += z;diff[y + 1] -= z;
}void update()
{for(int i = 1; i <= n; i++){a[i] = diff[i] + a[i - 1];}
}int main()
{while(cin>>n>>m){for(int i = 1; i <= n; i++) cin>>a[i];init();for(int i = 1; i <= m; i++) {int x, y, z; cin>>x>>y>>z;fc(x, y, z);}update();for(int i = 1; i <= n; i++) cout<<a[i]<<" ";cout<<endl;}return 0;
}

小明的彩灯

link:1.小明的彩灯 - 蓝桥云课

code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = int(5e5 + 7);
int N, Q;
ll a[MAXN], diff[MAXN];int main()
{cin>>N>>Q;for(int i = 1; i <= N; i++) cin>>a[i];for(int i = 1; i <= N; i++) diff[i] = a[i] - a[i - 1];while(Q--){int l, r, x; cin>>l>>r>>x;diff[l] += x;diff[r + 1] -= x;}for(int i = 1; i <= N; i++) a[i] = diff[i] + a[i-1];for(int i = 1; i <= N; i++) cout<<max(0ll, a[i])<<" ";return 0;
}

http://www.dtcms.com/a/339291.html

相关文章:

  • 深度学习 --- 基于ResNet50的野外可食用鲜花分类项目代码
  • 基于单片机身体健康监测/身体参数测量/心率血氧血压
  • 接口性能测试工具 - JMeter
  • . keepalived+haproxy
  • Ubuntu22.04安装docker最新教程,包含安装自动脚本
  • 【QT入门到晋级】进程间通信(IPC)-socket(包含详细分析及性能优化)
  • Day08 Go语言学习
  • C#/.NET/.NET Core技术前沿周刊 | 第 50 期(2025年8.11-8.17)
  • es7.x es的高亮与solr高亮查询的对比对比说明
  • 彻底清理旧版本 Docker 的痕迹
  • pytorch学习笔记-模型训练、利用GPU加速训练(两种方法)、使用模型完成任务
  • 常见的软件图片缩放,算法如何选择?
  • 深入解析Spring MVC运行流程:从请求到响应的完整旅程
  • 完整的训练与测试套路 小土堆pytorch记录
  • PyTorch自动求导
  • PID调节
  • Go 进阶学习路线
  • 传统艾灸VS七彩喜艾灸机器人:同样的艾香,多了4分“巧”
  • 电脑出现‘无法启动此程序,因为计算机中丢失dll’要怎么办?2025最新的解决方法分析
  • 家庭健康能量站:微高压氧舱结合艾灸机器人,智享双重养生SPA
  • 大模型基础:Foundamentals of LLM
  • 关于物理世界、感知世界、认知世界与符号世界统一信息结构的跨领域探索
  • 最近常问的70道vue相关面试题
  • 豆包1.5 Vision Lite 对比 GPT-5-min,谁更适合你?实测AI模型选型利器 | AIBase
  • 【Langchain系列七】Langchain+FastAPI(字符串输出与OpenAI规范流式输出)+FastGPT
  • 《若依》项目结构分析
  • 温故而知新 再看设计模式
  • 2025.8.19总结
  • 防抖技术(一)——OIS光学防抖技术详解
  • 块存储 对象存储 文件存储的区别与联系