【C语言】二维数组前缀和

相信你是最棒哒!!!

文章目录

问题描述

题目代码:

总结


问题描述

输入一个 𝑛n 行 𝑚m 列的整数矩阵,再输入 𝑞q 个询问,每个询问包含四个整数 𝑥1,𝑦1,𝑥2,𝑦2x1​,y1​,x2​,y2​,表示一个子矩阵的左上角坐标和右下角坐标。

对于每个询问输出子矩阵中所有数的和。

输入

第一行包含三个整数 𝑛,𝑚,𝑞n,m,q。

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

接下来 𝑞q 行,每行包含四个整数 𝑥1,𝑦1,𝑥2,𝑦2x1​,y1​,x2​,y2​,表示一组询问。

输出

共 𝑞q 行,每行输出一个询问的结果。

样例

InputcopyOutputcopy
3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4
17
27
21

Hint

【数据范围】

1≤𝑛,𝑚≤50001≤n,m≤5000,

1≤𝑞≤1000001≤q≤100000,

1≤𝑥1≤𝑥2≤𝑛1≤x1​≤x2​≤n,

1≤𝑦1≤𝑦2≤𝑚1≤y1​≤y2​≤m,

−10000≤矩阵内元素的值≤10000−10000≤矩阵内元素的值≤10000。


题目代码:

注释版

#include<stdio.h> long long a[5010][5010], s[5010][5010];int main() 
{long long int n, m, q; // 声明三个长整型变量,分别用于存储矩阵的行数、列数和查询次数scanf_s("%lld%lld%lld", &n, &m, &q); // 使用scanf_s函数读取输入的行数、列数和查询次数// 读取原始矩阵a的值for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)scanf("%lld", &a[i][j]);// 计算前缀和矩阵sfor (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];// 利用前缀和的性质计算当前位置的和// 处理查询while (q--) // 循环处理q次查询{long long int x1, x2, y1, y2;scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2); // 利用前缀和快速计算子矩阵的和long long int sum = s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1]; // 根据前缀和的性质计算子矩阵的和printf("%lld\n", sum); // 输出子矩阵的和}return 0; 
}

简洁版

#include<stdio.h>
long long a[5010][5010], s[5010][5010];
int main()
{long long int n, m, q;scanf_s("%lld%lld%lld", &n, &m, &q);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)scanf("%lld", &a[i][j]);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];while (q--){long long int x1, x2, y1, y2;scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);long long int sum = s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1];printf("%lld\n", sum);}return 0;
}


总结

代码的核心思想是利用前缀和来快速计算子矩阵的和。前缀和矩阵 s 的每个元素 s[i][j] 表示从矩阵 a 的左上角 (1,1) 到当前位置 (i,j) 的所有元素的和。这样,当我们需要计算任意子矩阵的和时,只需要使用四个前缀和元素的值进行简单的加减运算即可得到结果。这种方法的时间复杂度为O(1),即常数时间内完成查询,大大提高了效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用脚本语言实现Lumerical官方案例——闪耀光栅(Blazed grating)(纯代码)(2)

接《使用脚本语言实现Lumerical官方案例——闪耀光栅(Blazed grating)(纯代码)(1)》 一、添加分析组 1.1 代码实现 #添加分析组 addanalysisgroup(); set("name", "grating_R"); set("x", 0); set("y", 2.5*um); addanalysisgrou…

车载测试技术栈

软件测试理论知识 了解软件测试的基本概念、流程和方法&#xff0c;包括测试需求分析、测试用例设计、测试执行、缺陷发现和修复等。 汽车行业知识 熟悉汽车行业的特点和规范&#xff0c;了解汽车的构造和工作原理&#xff0c;包括发动机、底盘、电气系统等。 通信协议知识 …

61 基于单片机的小车雷达避障及阈值可调

所有仿真详情导航&#xff1a; PROTEUS专栏说明-CSDN博客 目录 一、主要功能 二、硬件资源 三、主程序编程 四、资源下载 一、主要功能 基于51单片机&#xff0c;采用超声波传感器检测距离&#xff0c;通过LCD1602显示屏显示&#xff0c;三个按键&#xff0c;第一个按键是…

Linux基本命令---文件权限与用户管理

在Linux系统中&#xff0c;文件权限与用户管理是两个核心概念&#xff0c;它们共同维护着系统的安全性和稳定性。以下是如何在Linux系统中体验文件权限与用户管理的详细步骤&#xff1a; 一、用户管理 创建新用户 使用adduser命令可以创建新用户。例如&#xff0c;创建一个名为…

Ubuntu——extrepo添加部分外部软件源

extrepo 是一个用于 Ubuntu 和其他基于 Debian 的系统的工具&#xff0c;它的主要作用是简化和管理外部软件源&#xff08;repositories&#xff09;的添加和更新。通过使用 extrepo&#xff0c;用户可以方便地添加、删除和管理第三方软件源&#xff0c;而不需要手动编辑源列表…

Java集合排序技术详解

在Java编程中&#xff0c;对集合进行排序是一项常见的任务。Java提供了多种方式来对集合进行排序&#xff0c;包括使用Collections.sort()、Arrays.sort()、List接口的sort()方法以及Java 8引入的Stream API。本文将详细介绍这些排序技术&#xff0c;并探讨它们的使用场景和性能…

WEB开发: Node.js路由之由浅入深(一) - 全栈工程师入门

作为一个使用Node.js多年的开发者&#xff0c;我已经习惯于用Node.js写一些web应用来为工作服务&#xff0c;因为实现快速、部署简单、自定义强。今天我们一起来学习一个全栈工程师必备技能&#xff1a;web路由。&#xff08;观看此文的前提是默认你已经装好nonde.js了&#xf…

【机器学习算法】——逻辑回归

目录 逻辑回归理解损失函数代码练习1. 房屋价格与面积的关系2.基于学生特征的录取概率预测 逻辑回归理解 逻辑回归是用来二分类的&#xff01; 是在线性回归模型之后加了一个激活函数&#xff08;Sigmoid)将预测值归一化到【0~1】之间&#xff0c;变成概率值。 一般计算其中一…

一个有意思pytorch的简单应用小实验

通过一个简单的脚本&#xff0c;来学习pytorch的基本应用&#xff0c;比如&#xff1a;前向传播、反向传播、学习率以及预测、模型的基本原理和套路。 得到结果。。。保存模型。。。输入参数。。。预测。。。像不像&#xff1f;。。。像多少&#xff1f;。。。 设计目标&#x…

使用lumerical脚本语言创建定向耦合器并进行数据分析(纯代码实现)

本文使用lumerical脚本语言创建定向耦合器波导、计算定向耦合器的偶数和奇数模式、分析定向耦合器的波长依赖性、分析定向耦合器的间隙依赖性(代码均有注释详解)。 一、绘制定向耦合器波导 1.1 代码实现 # 这段代码主要实现了绘制定向耦合器波导几何结构的功能。通过定义各种…

Linux 35.6 + JetPack v5.1.4之RTP实时视频Python框架

Linux 35.6 JetPack v5.1.4之RTP实时视频Python框架 1. 源由2. 思路3. 方法论3.1 扩展思考 - 慎谋而后定3.2 扩展思考 - 拒绝拖延或犹豫3.3 扩展思考 - 哲学思考3.4 逻辑实操 - 方法论 4 准备5. 分析5.1 gst-launch-1.05.1.1 xvimagesink5.1.2 nv3dsink5.1.3 nv3dsink sync05…

企业风险投资、融资事件数据(1921-2024)

数据包括历年上市与非上市企业的风险投资融资数据等数据&#xff0c;包括融资时间、被投企业、投资方、退出方等数据&#xff0c;希望对大家的研究有所帮助 一、数据介绍 数据名称&#xff1a;企业风险投资、融资事件 数据范围&#xff1a;上市与非上市企业 数据年份&#x…

移远5G模块移植

移远5G模块移植 1.NCM网卡配置2.拨号工具编译3.程序运行 1.NCM网卡配置 1.1、内核配置 打开内核配置界面&#xff0c;并找到USB Network Adapters进行NCM网卡配置 > Device Drivers > Network device support > USB Network Adapters 1.2、驱动修改 打开内核源码钟的…

基于单片机的智能农田灌溉节水系统设计及应用

摘 要 &#xff1a; 针对传统的灌溉方法浪费水资源节水系统设计。该系统从节水角度出发&#xff0c;对传感器和主电路进行了设计&#xff0c;主要采集灌溉地的湿度与温度数据&#xff0c;根据测量土壤中的温度与湿度作为主要参数&#xff0c;对农田灌溉节水系统进行实时控制&am…

煤矿 35kV 变电站 3 套巡检机器人 “上岗”,力破供电瓶颈

近日&#xff0c;杭州旗晟智能科技与甘肃某变电站配电室的三套智能巡检机器人线下测试顺利完成&#xff0c;并成功交付使用&#xff0c;这为电力运维工作注入了全新的活力与强大的技术支撑。 一、项目背景 甘肃某变电站总建筑面积1098平方米的变电站集变电、配电、监控等多功能…

什么是封装性?C++ 中如何实现封装?封装性的好处是什么?

一、引言 在面向对象编程中&#xff0c;封装性是一个重要的概念。封装可以帮助我们更好地组织和管理代码&#xff0c;提高代码的可维护性、可扩展性和安全性。本文将详细介绍什么是封装性&#xff0c;C 中如何实现封装以及封装性的好处。 二、什么是封装性&#xff1f; 封装…

docker 相关问题记录

docker mysql 一直重启解决办法&#xff08;断电或者重启&#xff09; 一直重启。。因为是内部开发&#xff0c;也没有备份最新的。所以不能删了重来。 方法&#xff1a; docker logs mysql5.7 看到错误跟innodb有关。 具体原因可以参考 http://acuilab.com/articles/2019/1…

如何在自动化安全测试中,实现多工具集成与数据融合,以提高对Spring Boot应用程序安全漏洞的检测效率与准确性?

为了在自动化安全测试中实现多工具集成与数据融合&#xff0c;以提高对Spring Boot应用程序安全漏洞的检测效率与准确性&#xff0c;可以采取以下策略和方法&#xff1a; 文章目录 1. 工具选择与集成2. 数据标准化与聚合3. 数据分析与融合4. 持续改进5. 实施示例 1. 工具选择与…

Java快速分组技术解析

在Java开发中&#xff0c;我们经常需要对数据进行分组处理&#xff0c;比如根据某个属性将数据集合中的元素分组。这种需求在处理数据库查询结果、日志分析、报表生成等场景中非常常见。本文将介绍几种Java中快速分组的技术&#xff0c;帮助开发者提高数据处理的效率。 1. 使用…

龙蜥 Linux 安装 JDK

龙蜥 Linux 安装 JDK 下载安装解压到目标路径设置环境变量直接在启动脚本中临时设置 参考资料 下载 这个就不赘述了&#xff0c;参考资料中的另外两篇安装帖&#xff0c;都有。 如果不能上网&#xff0c;也可以去内网其他之前装过JDK的服务器&#xff0c;直接复制过来。 tar …