跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

二维差分算法详解:模板题与地毯问题实战

综述由AI生成二维差分算法利用差分数组性质高效处理子矩阵的区间修改。通过在四个关键点加减数值,配合前缀和运算即可还原矩阵状态。结合模板题与地毯问题,演示了二维差分的构建与查询流程,涵盖核心公式推导及 C++ 代码实现,适合需要优化矩阵操作效率的开发者参考。

无尘发布于 2026/3/24更新于 2026/5/36 浏览
二维差分算法详解:模板题与地毯问题实战

二维差分算法详解

一、二维差分原理

我们可以类比一维差分数组的性质,推导出二维差分矩阵的核心逻辑:

  • 标记修改:在差分数组的特定位置记录增量,表示后续区域统一被修改;
  • 还原数组:对差分数组求前缀和,即可还原出原始矩阵。

假设我们需要将原始矩阵 a 中,以 (x1, y1) 为左上角、(x2, y2) 为右下角的子矩阵每个元素都加上 k。操作后的效果如下所示:

二维差分示意图

核心结论:

利用差分矩阵的性质,只需在四个关键点进行操作:

f[x1][y1] += k
f[x1][y2 + 1] -= k
f[x2 + 1][y1] -= k
f[x2 + 1][y2 + 1] += k

这样就能保证只有目标子矩阵内的元素增加了 k,而外部不受影响。

二、经典算法题实战

1. 【模板】差分

题目描述

给定一个 n 行 m 列的整数矩阵,初始全为 0。有 q 次操作,每次操作将某个子矩阵的元素加上一个值。最后输出整个矩阵。

思路解析

这道题是二维差分的基础应用。我们需要先根据初始输入构建差分矩阵,然后处理所有的区间更新操作,最后通过前缀和还原出最终结果。

注意这里有个细节:初始输入时,每个点本身也是一个子矩阵(左上角和右下角相同),所以也要调用更新函数。

代码实现
#include <iostream>
using namespace std;

typedef long long LL;
const int N = 1100;
LL f[N][N];

// 更新函数:将 (x1,y1) 到 (x2,y2) 的区域加上 k
void calc(LL x1, LL y1, LL x2, LL y2, LL k) {
    f[x1][y1] += k;
    f[x1][y2 + ] -= k;
    f[x2 + ][y1] -= k;
    f[x2 + ][y2 + ] += k;
}

{
     n, m, q;
    cin >> n >> m >> q;

    
     ( i = ; i <= n; i++) {
         ( j = ; j <= m; j++) {
            LL x;
            cin >> x;
            
            (i, j, i, j, x);
        }
    }

    
     (q--) {
        LL x1, y1, x2, y2, k;
        cin >> x1 >> y1 >> x2 >> y2 >> k;
        (x1, y1, x2, y2, k);
    }

    
     ( i = ; i <= n; i++) {
         ( j = ; j <= m; j++) {
            f[i][j] += f[i - ][j] + f[i][j - ] - f[i - ][j - ];
        }
    }

    
     ( i = ; i <= n; i++) {
         ( j = ; j <= m; j++) cout << f[i][j] << ;
        cout << endl;
    }
     ;
}
1
1
1
1
int main()
int
// 初始化差分矩阵
for
int
1
for
int
1
// [i, j] 为左上角,[i, j] 为右下角的矩阵,统一加上 x
calc
// 处理 q 次查询
while
calc
// 计算前缀和还原原矩阵
for
int
1
for
int
1
1
1
1
1
// 输出结果
for
int
1
for
int
1
" "
return
0

2. 地毯问题

题目描述

给定一个 n 行 m 列的网格,初始全为 0。有 m 次操作,每次操作将某个矩形区域染成一种颜色(覆盖)。最后统计每个格子被覆盖了多少次。

思路解析

这题本质上还是二维差分。虽然题目背景是'染色',但逻辑上等同于给指定区域加 1。不同的是,这里不需要还原具体的颜色值,而是统计覆盖次数。同样利用差分矩阵 + 前缀和的方法,时间复杂度从 O(nmQ) 优化到了 O(n*m + Q)。

代码实现
#include <iostream>
using namespace std;

const int N = 1010;
int a[N][N]; // 差分矩阵

// 更新函数:将 (x1,y1) 到 (x2,y2) 的区域加 1
void calc(int x1, int y1, int x2, int y2) {
    a[x1][y1]++;
    a[x1][y2 + 1]--;
    a[x2 + 1][y1]--;
    a[x2 + 1][y2 + 1]++;
}

int main() {
    int n, m;
    cin >> n >> m;

    // 处理所有覆盖操作
    while (m--) {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        calc(x1, y1, x2, y2);
    }

    // 计算前缀和还原覆盖次数
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
        }
    }

    // 输出结果
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) cout << a[i][j] << " ";
        cout << endl;
    }
    return 0;
}

三、总结

二维差分是处理大规模矩阵区间修改的高效工具。它的核心在于利用四个点的加减操作来锁定影响范围,再通过前缀和运算恢复真实数据。在实际工程中,当遇到需要频繁更新子矩阵的场景时,优先考虑这种 O(1) 更新、O(NM) 查询的方案,能显著提升性能。

目录

  1. 二维差分算法详解
  2. 一、二维差分原理
  3. 二、经典算法题实战
  4. 1. 【模板】差分
  5. 题目描述
  6. 思路解析
  7. 代码实现
  8. 2. 地毯问题
  9. 题目描述
  10. 思路解析
  11. 代码实现
  12. 三、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 4090 显卡实测:圣光艺苑 AI 绘画工具生成古典名画效果展示
  • 苹果 MATLAB MAC 版安装教程
  • Llama 3.1 模型部署实践与体验
  • 大模型开发转行指南:必备知识、技能与学习路径详解
  • Java 与 Kotlin 泛型核心难点解析
  • C++ 字符串类基础与常见算法题解析
  • 基于 STM32 的智能宠物喂食系统设计与实现
  • C++ std::function 包装器与 bind 绑定详解
  • Android 开发者进阶指南:核心技能体系与学习路径
  • 22 个优质 Python 学习网站推荐
  • OpenClaw 龙虾机器人本地免费部署实战指南
  • 时序数据库 Apache IoTDB 全链路数据管理、部署与安全特性解读
  • 基于 mciSendCommand 的 C++ 音乐播放类实现
  • 通义万相 2.1 技术解析:多模态生成的突破与应用
  • 无人机飞行空域申请全流程指南
  • ControlNet-sd21 入门指南:AI 绘画精准控制方法
  • 即梦 AI 基础操作指南:从绘画到视频生成
  • C++11 新特性(下):Lambda、可变参数模板与包装器
  • Python 实现 MCP 客户端调用高德地图天气查询示例
  • AI 时代重读《人人都是产品经理》:核心内核与产品实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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