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

C++ 二维差分解决矩阵区间更新问题

综述由AI生成介绍使用 C++ 和二维差分数组解决矩阵区间更新问题的方法。题目要求在 n×m 矩阵上执行多次子矩阵加法操作,暴力解法效率低。通过构建差分数组,可在 O(1) 时间内标记区间变化,最后通过前缀和还原矩阵,整体复杂度 O(nm)。代码实现了差分初始化、区间更新及结果输出,适合处理大规模数据。

数字游民发布于 2026/3/28更新于 2026/5/3022 浏览

题目描述

小羊肖恩最近喜欢上了投球游戏,但他已经不满足只有一行球筐的玩法了。

具体来说,在他面前摆放了 n×m 个球筐,这些球筐形成了一个 n×m 的矩阵,整数 ai,j 表示第 i 行第 j 列的球筐最开始的球的个数。

接下来小羊会进行 q 次操作,每次操作会给出五个整数 x1,y1,x2,y2,c,他会将以 (x1,y1) 为左上角,(x2,y2) 为右下角的球筐矩阵都投入 c 个球。请你输出操作完成之后每个框各有多少个球?

输入格式

第一行输入三个整数 n,m,q,表示球筐矩阵的大小和操作次数。

接下来 n 行,每行包含 m 个整数,表示球筐矩阵。

接下来 q 行,每次输入五个整数 x1,y1,x2,y2,c。

数据范围保证:1≤q≤10^5,1≤n,m≤10^3,1≤x1≤x2≤n,1≤y1≤y2≤m,1≤ai,j,c≤10^5。

输出格式

输出 n 行,每行 m 个数,表示操作完毕后每个球筐里球的个数。

参考代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e3+10;
int a[N][N],diff[N][N];

int main()
{
   ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
   int n,m,q;cin>>n>>m>>q;
   for(int i=1;i<=n;i++){
       for(int j=1;j<=m;j++){
           cin>>a[i][j];
           diff[i][j]+=a[i][j];
           diff[i][j+1]-=a[i][j];
           diff[i+1][j]-=a[i][j];
           diff[i+1][j+1]+=a[i][j];
       }
   }
   while(q--){
       int x1,y1,x2,y2,c;
       cin>>x1>>y1>>x2>>y2>>c;
       diff[x1][y1]+=c;
       diff[x1][y2+1]-=c;
       diff[x2+1][y1]-=c;
       diff[x2+1][y2+1]+=c;
   }
   for(int i=1;i<=n;i++){
       for(int j=1;j<=m;j++){
           a[i][j]=a[i][j-1]+a[i-1][j]-a[i-1][j-1]+diff[i][j];
       }
   }
   for(int i=1;i<=n;i++){
       for(int j=1;j<=m;j++){
           cout<<a[i][j]<<' ';
       }
       cout<<'\n';
   }
   return 0;
}

核心知识点:二维差分

二维差分数组是一种用于记录矩阵局部区域的变化的数组。设有一个矩阵 a,我们定义差分数组 s 如下:

si,j=ai,j−ai−1,j−ai,j−1+ai−1,j−1

这里的差分数组记录了从矩阵的 (1,1) 到 (i,j) 的矩形区域所发生的变化。

对于本题,我们需要在一个子矩阵中同时修改多个格子的值。差分数组的优势在于,我们可以通过修改差分数组的边界值,来实现对子矩阵内所有格子的值的同时修改。

具体地,当我们需要给子矩阵 (x1,y1) 到 (x2,y2) 中的每个格子都加上 c 时,我们可以对差分数组进行如下操作:

  1. sx1,y1+=c
  2. sx1,y2+1−=c
  3. sx2+1,y1−=c
  4. sx2+1,y2+1+=c

经过这样的操作,我们实际上在差分数组中标记了一个子矩阵区域的变化。最后,我们需要根据差分数组恢复原矩阵,以得到最终每个格子的球的个数。

恢复原矩阵的方法如下:

ai,j=ai−1,j+ai,j−1−ai−1,j−1+si,j

可以看到,恢复原矩阵的过程是通过累加差分数组的值来完成的。

注意检查代码末尾分号是否存在,确保输入法处于英语模式且无语法错误。

目录

  1. 题目描述
  2. 输入格式
  3. 输出格式
  4. 参考代码
  5. 核心知识点:二维差分
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Python OpenCV 调用海康威视工业相机
  • AI 辅助开发:Node.js WebSocket 内网穿透系统搭建
  • 机器人自主导航避障全栈方案(涵盖ROS2实现与实车测试数据)
  • 攻防世界 Web 安全挑战题解 (八): 加密、反序列化与 RCE
  • HarmonyOS 游戏开发实践:按钮与文字精准控制详解
  • Go Web 开发核心理论与实战基础
  • 前端渲染 Markdown 格式:从基础到实战
  • 精准努力:被蝙蝠咬死的野马死于愤怒
  • BeagleBone Black 从 SD 卡启动 Android 系统及性能评测
  • 函数柯里化
  • C++ 实现 DLL 注入原理与源码示例
  • 微信小程序从 0 到 1 开发部署全流程指南
  • Flutter Web 开发:解决跨域(CORS)问题的方法
  • Linux 进程通信:System V 共享内存原理与 C++ 封装实战
  • Win10 彻底关闭 Microsoft 365 Copilot 弹窗的 6 种方法
  • 开源 AI 编程工具对比:Superpowers 技能库与 OpenSpec 规范驱动
  • Linux 下 libwebkit2gtk-4.1-0 安装与实战指南
  • 移动端部署 Stable Diffusion 开源方案与使用指南
  • 双指针算法专题:快乐数与盛水最多的容器
  • Supabase 全栈开发实战:数据库、认证与本地部署

相关免费在线工具

  • 加密/解密文本

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