跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

算法基础篇:一维差分专题与实战应用

一维差分算法通过预处理优化区间查询与修改效率,本质是前缀和的逆运算。文章详解差分数组的构建方式、区间更新公式及原数组还原方法。结合【模板】差分和海底高铁两道典型例题,提供 C++ 代码实现与逻辑分析,帮助读者掌握利用空间换时间的技巧,快速解决大规模数据下的区间操作问题。

开源信徒发布于 2026/1/26更新于 2026/9/1162 浏览
算法基础篇:一维差分专题与实战应用

一、差分

前缀和与差分的核心思想是预处理,能在暴力枚举过程中快速给出查询结果,从而优化时间复杂度。这是经典的用空间换时间的做法。

本质:前缀和与差分是一对互逆的运算。

二、一维差分

2.1 差分数组构建方式

基于定义:f[i] = a[i] - a[i-1]

基于性质(用于区间更新):f[L] += c, f[R+1] -= c

2.2 根据差分数组的性质处理区间修改

核心逻辑是在区间起点增加数值,在终点后一位减少数值。这样在进行前缀和还原时,中间段都会受到影响,而区间外不受影响。

2.3 还原数组

对差分数组做一次「前缀和」,即可还原出原数组。

三、一维差分经典算法题

3.1【模板】差分

题目描述

给定一个长度为 n 的数列,每次操作将区间 [l, r] 内的数都加上 k,最后输出整个数列。

算法原理

依照一维差分原理模拟即可。先通过初始数组构建差分数组,再执行区间修改,最后还原。

代码实现

方法一:直接利用差分数组性质
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int f[N];

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        f[i] += x;
        f[i + 1] -= x;
    }
    while (m--) {
        int l, r, k;
        cin >> l >> r >> k;
        f[l] += k;
        f[r + 1] -= k;
    }
    for (int i = 1; i <= n; i++) {
        f[i] += f[i - 1];
        cout << f[i] << " ";
    }
     ;
}
return
0
方法二:严格根据定义构建
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int f[N];
int a[N];

int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) f[i] = a[i] - a[i - 1];
    while (m--) {
        int l, r, k;
        cin >> l >> r >> k;
        f[l] += k;
        f[r + 1] -= k;
    }
    for (int i = 1; i <= n; i++) {
        f[i] += f[i - 1];
        cout << f[i] << " ";
    }
    return 0;
}

3.2 海底高铁

题目描述

有 n 个城市,m 次访问记录。每次访问从城市 p_i 到 p_{i+1}。每条路段有三种收费方式:按次买票、办卡(含工本费)、其他。求最小总花费。

算法原理

  1. 计算最小花费:每段路被乘坐的次数记作 f[i]。最小花费为 min(按次花费,办卡花费)。
    • 按次花费:a[i] * f[i]
    • 办卡花费:b[i] * f[i] + c[i]
  2. 统计乘坐次数:利用差分数组统计每段路的使用频率。
    • 创建全 0 差分数组。
    • 遍历访问序列,对于每次访问 p_i -> p_{i+1},区间 [min(p_i, p_{i+1}), max(p_i, p_{i+1}) - 1] 加 1。
    • 注意:如果 p_i > p_{i+1},需交换顺序。
    • 最后对差分数组做前缀和得到实际次数。

代码实现

#include<iostream>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
LL f[N];

int main() {
    LL n, m;
    cin >> n >> m;
    LL x;
    cin >> x;
    for (int i = 2; i <= m; i++) {
        LL y;
        cin >> y;
        // x -> y
        if (y > x) {
            f[x]++;
            f[y]--;
        } else {
            f[x]--;
            f[y]++;
        }
        x = y;
    }
    for (int i = 1; i < n; i++) f[i] += f[i - 1];
    
    LL ret = 0;
    for (int i = 1; i < n; i++) {
        LL a, b, c;
        cin >> a >> b >> c;
        ret += min(a * f[i], c + b * f[i]);
    }
    cout << ret << endl;
    return 0;
}

提示:在实际开发中,处理大规模数据区间更新时,务必优先考虑差分或线段树等数据结构,避免 O(n*m) 的暴力解法导致超时。

目录

  1. 一、差分
  2. 二、一维差分
  3. 2.1 差分数组构建方式
  4. 2.2 根据差分数组的性质处理区间修改
  5. 2.3 还原数组
  6. 三、一维差分经典算法题
  7. 3.1【模板】差分
  8. 题目描述
  9. 算法原理
  10. 代码实现
  11. 方法一:直接利用差分数组性质
  12. 方法二:严格根据定义构建
  13. 3.2 海底高铁
  14. 题目描述
  15. 算法原理
  16. 代码实现

更多推荐文章

查看全部
  • 《AI 提效手册》深度解读:五款主流 AI 工具实战指南
  • 数据结构基础:栈与队列的顺序及链式实现
  • LLM 大语言模型进化路线与领域微调技术应用
  • ComfyUI 插件管理完全指南
  • 进程级沙箱隔离与 WebGL 指纹抗识别技术实践
  • 2026 年 AI Agent 开发:10 个实战验证的设计模式
  • 飞算 JavaAI 代码审查落地实践与关键细节
  • C++ 实现通用字符串分割 split 函数
  • 基于 cpolar 内网穿透远程部署 Open-Lovable 网页克隆工具
  • 2026 年前端高频面试场景题与核心考点梳理
  • 攻防世界 MISC 进阶题:图片隐写与 UUencode 解密实战
  • 基于 OpenClaw 与 Claude 的自动化写作系统搭建实践
  • 文心一言 ERNIE-4.5-0.3B 轻量化部署与效能突破
  • 消息队列原理与实战:Linux IPC 接口及责任链模式设计
  • LLaMA Factory 大模型训练与微调完整教程
  • 基于 AI 辅助的 Java 零基础入门与基础实战指南
  • 国家计算机二级证书的价值与备考指南
  • Rust 语言发展历史与核心特性解析
  • iOS 开发新系统兼容适配:UITabBar 液态玻璃效果与 WiFi 获取
  • JavaScript 表单选项处理:单选与多选的核心用法

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online