C++课后习题训练记录Day88

1.练习项目:

问题描述

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

具体来说,在他面前摆放了 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≤105,1≤n,m≤103,1≤x1≤x2≤n,1≤y1≤y2≤m,1≤ai,j,c≤105。

输出格式

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

2.选择课程

在蓝桥云课中选择课程《16届蓝桥杯省赛无忧班(C&C++ 组)4期》,选择第二章"基础算法"编程24并开始练习。

3.开始练习

(1)源码:

#include<bits/stdc++.h>

using namespace std;

using ll=long long;

const int N=1e3+10;

int aNN,diffNN;

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>>aij;

diffij+=aij;

diffij+1-=aij;

diffi+1j-=aij;

diffi+1j+1+=aij;

}

}

while(q--){

int x1,y1,x2,y2,c;

cin>>x1>>y1>>x2>>y2>>c;

diffx1y1+=c;

diffx1y2+1-=c;

diffx2+1y1-=c;

diffx2+1y2+1+=c;

}

for(int i=1;i<=n;i++){

for(int j=1;j<=m;j++){

aij=aij-1+ai-1j-ai-1j-1+diffij;

}

}

for(int i=1;i<=n;i++){

for(int j=1;j<=m;j++){

cout<<aij<<' ';

}

cout<<'\n';

}

return 0;

}

(2)检验结果

对此代码进行检验,检验后无报错,提交此代码,判题结果为正确100分。

(3)练习心得:

二维差分定义和推导过程

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

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

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

注意每段代码末尾的分号是否存在,如不存在则需即使补充;输入法是否切换为英语模式;语法是否错误。

相关推荐
zwc321043205527 分钟前
Day 5:threshold与inRange阈值分割
c++·图像处理·人工智能·opencv·算法·计算机视觉
OxYGC32 分钟前
[工程] PHP2Shell 漏洞解析:两条 PHP 内核 RCE,为什么应用层的防护全部失效
android·开发语言·php
小徐不徐说35 分钟前
数据库存储基础:理解表结构、主键、事务与 BLOB
开发语言·数据库·c++·qt·程序设计
草莓熊Lotso1 小时前
【C++ 基于微服务的即时通讯系统】网关基建:cpp-httplib 与 WebSocketpp 从入门到实战
linux·开发语言·数据库·c++·redis·微服务·云原生
李纲明1 小时前
WordPress 媒体库上传失败或一直转圈:先核 PHP 上传限制与目录权限,再查安全插件与对象存储
运维·开发语言·安全·php·wordpress·媒体库·devdiy
第九序言T9 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Sakura_j_h_10 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川10 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人11 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas10011 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品