(蓝桥杯)二维数组前缀和典型例题——子矩阵求和

server/2025/1/15 11:36:03/

题目描述

小 A 同学有着很强的计算能力,张老师为了检验小 AA同学的计算能力,写了一个 n 行 m 列的矩阵数列。

张老师问了小 A 同学 k 个问题,每个问题会先告知小 A 同学 4 个数 x1,y1,x2,y2画出一个子矩阵,张老师请小 A同学计算出这个子矩阵中所有数的和。

请你编程帮助张老师计算出结果。

输入

第一行包含三个整数 n,m,k 。

接下来 n 行,每行包含 m 个整数。

接下来 k 行,每行包含四个整数 x1​,y1​,x2​,y2​,表示一组询问。

数据范围

1≤n,m≤1000。

1≤k≤200000。

1≤x1​≤x2​≤n,≤y1​≤y2​≤m。

矩阵内元素的值均在 [−1000,1000] 的范围内。

输出

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

样例

输入:

3 5 4
1 1 6 7 4
6 10 4 9 9
2 6 7 3 7
1 2 2 4
2 4 3 5
2 2 3 5
1 3 2 4

输出:

37
28
55
26

知识点

1.二维数组前缀和

 2、python输入输出优化

问题: 这是第一版的代码 老是运行超时

解法:因为 Python 的 input()print() 在大量数据时可能会比较慢。我们可以使用 sys.stdin.readline() 来代替 input(),并使用 sys.stdout.write() 来代替 print(),以减少 I/O 操作的时间开销。

输入优化:使用 sys.stdin.readline() 代替 input(),这样可以更快地读取输入数据。

输出优化:使用 sys.stdout.write() 代替 print(),这样可以更快地输出结果。注意 sys.stdout.write() 不会自动添加换行符,所以需要手动添加 \n

 输入优化:使用 sys.stdin.readline() 代替 input()

在 Python 中,input() 函数用于从标准输入读取一行数据,并返回一个字符串。虽然 input() 使用起来非常方便,但在处理大量输入数据时,它的性能可能会比较差。这是因为 input() 函数在内部进行了一些额外的处理,比如处理换行符、缓冲区管理等。

sys.stdin.readline() 是一个更底层的输入函数,它直接从标准输入读取一行数据,并返回一个字符串,包括行尾的换行符。使用 sys.stdin.readline() 可以减少一些不必要的处理,从而提高输入的效率。

示例

python">import sys# 使用 input() 读取一行数据
line = input().strip()  # strip() 用于去除行尾的换行符# 使用 sys.stdin.readline() 读取一行数据
line = sys.stdin.readline().strip()  # 同样需要 strip() 去除行尾的换行符

输出优化:使用 sys.stdout.write() 代替 print()

print() 函数用于将数据输出到标准输出,并自动添加换行符。虽然 print() 使用起来非常方便,但在处理大量输出数据时,它的性能可能会比较差。这是因为 print() 函数在内部进行了一些额外的处理,比如格式化输出、换行符管理等。

sys.stdout.write() 是一个更底层的输出函数,它直接将字符串写入标准输出,不会自动添加换行符。使用 sys.stdout.write() 可以减少一些不必要的处理,从而提高输出的效率。

示例

python">import sys# 使用 print() 输出数据
print("Hello, World!")# 使用 sys.stdout.write() 输出数据
sys.stdout.write("Hello, World!\n")  # 需要手动添加换行符

性能对比

在处理大量数据时,使用 sys.stdin.readline()sys.stdout.write() 可以显著提高程序的运行效率。以下是一个简单的性能对比示例:

使用 input()print()

使用 sys.stdin.readline()sys.stdout.write()

python">import time
import sysstart_time = time.time()for _ in range(1000000):line = sys.stdin.readline().strip()sys.stdout.write(line + '\n')end_time = time.time()
print("Time taken:", end_time - start_time)

代码

代码1

python">n, m, k = map(int, input().split())
a = []
for i in range(n):a.append(list(map(int, input().split())))
b = []
for i in range(k):b.append(list(map(int, input().split())))
c = [[0] * (m + 1) for i in range(n + 1)]
for i in range(1, n + 1):for j in range(1, m + 1):c[i][j] = c[i - 1][j] + c[i][j - 1] - c[i - 1][j - 1] + a[i - 1][j - 1]
for i in range(k):x1, y1, x2, y2 = b[i][0], b[i][1], b[i][2], b[i][3]print(c[x2][y2] - c[x1 - 1][y2] - c[x2][y1 - 1] + c[x1 - 1][y1 - 1])

代码2

python">import sys# 使用 sys.stdin.readline() 读取输入
n, m, k = map(int, sys.stdin.readline().split())
a = []
for i in range(n):a.append(list(map(int, sys.stdin.readline().split())))
b = []
for i in range(k):b.append(list(map(int, sys.stdin.readline().split())))# 构建前缀和数组
c = [[0] * (m + 1) for i in range(n + 1)]
for i in range(1, n + 1):for j in range(1, m + 1):c[i][j] = c[i - 1][j] + c[i][j - 1] - c[i - 1][j - 1] + a[i - 1][j - 1]# 使用 sys.stdout.write() 输出结果
for i in range(k):x1, y1, x2, y2 = b[i][0], b[i][1], b[i][2], b[i][3]sys.stdout.write(str(c[x2][y2] - c[x1 - 1][y2] - c[x2][y1 - 1] + c[x1 - 1][y1 - 1]) + '\n')

http://www.ppmy.cn/server/158543.html

相关文章

计算机视觉算法实战——手写公式识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​​​​​​​​​​​​​​​​ 1. 领域介绍✨✨ 手写公式识别(Handwritten Mathematical Expression Recognition, HME…

Excel如何制作轮班表

Excel如何制作轮班表 1. 概念讲解2. 例子3. 详细讲解3.1 前期准备3.2 人员依次编号3.3 填入日期,和日期编号3.4 Mod函数-填充值班人员编号3.4 Vlookup函数-进行查找人员 操作文档 1. 概念讲解 轮班是指一种工作安排系统,员工每天、每周或每月在不同班次…

初识JAVA-面向对象的三大特征之多态

1. 重温面向对象 面向对象是一种解决问题的思想,它把计算机程序看作是各种对象组合起来的。每个对象都有自己的数据(属性)和行为(方法),主要依靠对象之间的交互来解决和实现问题。Java是一门纯面向对象的语…

【数据仓库】— 5分钟浅谈数据仓库(适合新手)从理论到实践

大家好,我是摇光~ 对于刚进入大数据领域的萌新,且想要在数据分析岗、数据运维岗、数据工程师这些岗位立足,了解数据仓库是必要的,接下来我尽量用通俗易懂的语言让大家了解到数据仓库。 在当今大数据盛行的时代,数据仓…

【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第13章ospf路由协议】理论和实操

文章目录 选择题(10道)理论题(5道)实操题(5道) 【网络云SRE运维开发】2025第3周-每日【2025/01/14】小测-【第12章ospf路由协议】理论和实操 选择题(10道) 在OSPF协议中&#xff0c…

Active Prompting with Chain-of-Thought for Large Language Models

题目 大型语言模型的思维链主动提示 论文地址:https://arxiv.org/abs/2302.12246 项目地址:https://github.com/shizhediao/active-prompt 摘要 大型语言模型(LLM)规模的不断扩大为各种需要推理的复杂任务带来了涌现能力,例如算术和常识推理…

Django创建项目速成

目录 1.创建项目 1.1 命令创建 1.2 pycharm创建 1.3 默认文件介绍 2.创建app 2.1 默认文件介绍 3.简单编写 3.1快速上手 确保app已经注册 编写url和视图函数的关系(创建关系) 编写视图函数 启动项目 4.模板语法 4.1 列表 4.2 字典 4.3 二…

基于YOLOv8与CGNet的鸟类智能识别系统 深度学习图像分类 鸟类目标检测与分类 图像特征提取 模型优化与应用 数据可视化(源码+指导+定制)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…