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

题目描述

小 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 sys

start_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')
相关推荐
nchu可乐百香果18 分钟前
sparkRDD教程之必会的题目
java·学习·spark·intellij-idea
大霸王龙19 分钟前
使用Selenium进行网页自动化测试
python·selenium·测试工具
wclass-zhengge21 分钟前
01基本介绍篇(D2_多线程问题)
开发语言·python
澄岚明雪23 分钟前
力扣经典题目之55.跳跃游戏
算法·leetcode·职场和发展
电子云与长程纠缠1 小时前
在UE5中使用视差贴图
学习·缓存·ue5·编辑器·贴图
蒙娜丽宁1 小时前
【人工智能】用Python进行对象检测:从OpenCV到YOLO的全面指南
开发语言·python
从以前1 小时前
BerSoft公司收入增长分析
python
柠石榴1 小时前
【练习】力扣热题100 有效的括号
c++·算法·leetcode·职场和发展
西猫雷婶1 小时前
python学opencv|读取图像(三十四)阈值处理-彩色图像
开发语言·python·opencv
wdfk_prog1 小时前
rtthread学习笔记系列(2) -- 宏
笔记·学习