前缀和个人见解(二)

2024-06-14 10:20
文章标签 个人见解 前缀

本文主要是介绍前缀和个人见解(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前缀和个人见解(二)

  • 二维前缀和数组
  • 构造二维前缀和数组
  • 二维前缀和数组的用途
    • 题目

二维前缀和数组

除了有一维前缀和,也可以推广到 二维。

假设我有一个二维数组,这些红色的点都是数组上的点。
在这里插入图片描述
其中用蓝色方框 选中的点 的前缀和 就是 下面的区域的数字之和。
在这里插入图片描述
假如是下面的这个点在这里插入图片描述

那么它的前缀和就是下面的区域的数字之和。
在这里插入图片描述


构造二维前缀和数组

接着我们来构造一个二维前缀和数组,也是利用递推的思路。

在这里插入图片描述
假设我们要求 紫色这个点的 二维前缀和。
在这里插入图片描述
我们可以先加上 这个点左边点的前缀和,也就是 绿色区域内数字之和。
在这里插入图片描述
然后再加上 紫色点 的 上边点 的前缀和,也就是 蓝色区域内的 数字之和。

此时会多加了一部分区域,也就是 蓝色和 绿色区域公共的部分,所以需要再减去 紫色点 的左上角点的前缀和。

当然最后得把我们紫色的值也给加上。

如果用代码写的话就是下面的公式。
在这里插入图片描述
当然 这里的 i 和 j 都不会取到 0,对于前缀和来说,留一层会方便会多。

二维前缀和数组的用途

那么构造了二维前缀和数组之后,它有什么用处呢?

其实跟一维的差不多,一维是求 一个区间内的和,那么二维就是求一个子矩阵的和。

在这里插入图片描述
比如我现在让你求这个 蓝色区域内 所有数之和,给你这个矩阵当中的 最左上角点的坐标和 最右下角点的坐标。

此时可以这么计算。
在这里插入图片描述

首先先加上 紫色点的前缀和。

在这里插入图片描述

然后减去 绿色点的前缀和。
在这里插入图片描述
再减去深蓝色的前缀和。

此时 深蓝色和 绿色公共的区域会 减去两次,则需要 再加上该区域,也就是下面 黄色点的前缀和。
在这里插入图片描述

此时 剩余的 就是我们蓝色 区域的 数字之和了。

公式如下:
在这里插入图片描述
其中 (x1, y1) (x2, y2) 分别为左上角和右下角的点的坐标。

接着我们来一起做做模版题。

题目

输入一个 n n n m m m 列的整数矩阵,再输入 q q q 个询问,每个询问包含四个整数 x 1 , y 1 , x 2 , y 2 x_1, y_1, x_2, y_2 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。

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

输入格式

第一行包含三个整数 n , m , q n,m,q nmq

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

接下来 q q q 行,每行包含四个整数 x 1 , y 1 , x 2 , y 2 x_1, y_1, x_2, y_2 x1,y1,x2,y2,表示一组询问。

输出格式

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

数据范围

1 ≤ n , m ≤ 1000 1 \le n,m \le 1000 1n,m1000,
1 ≤ q ≤ 200000 1 \le q \le 200000 1q200000,
1 ≤ x 1 ≤ x 2 ≤ n 1 \le x_1 \le x_2 \le n 1x1x2n,
1 ≤ y 1 ≤ y 2 ≤ m 1 \le y_1 \le y_2 \le m 1y1y2m,
− 1000 ≤ 矩阵内元素的值 ≤ 1000 -1000 \le 矩阵内元素的值 \le 1000 1000矩阵内元素的值1000

输入样例:

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

准备阶段:
在这里插入图片描述
其中 数组 a 存储题目给的原 数据,数组 s 为 a 的 前缀和 数组。

接着写 输入环节,注意是从 1 开始哦,猛猛记住这一点。

在这里插入图片描述

之后开始构造我们的 前缀和数组。

这里直接根据公式来就好了,注意公式一定要理解的去背,不能死记硬背。

在这里插入图片描述

在写这些公式的时候,你可以自己在脑海里想 区域,这样子会方便记忆公式。

在构造好前缀和数组后,接着就是面临 q 次询问。
在这里插入图片描述
对于每次询问,题目会每次给我们两个坐标,然后我们利用 刚才将的公式 直接输出就好啦。
在这里插入图片描述
完整代码如下:

#include <iostream>
using namespace std;const int N = 1010;
int n, m, q;
int a[N][N], s[N][N];int main()
{scanf("%d%d%d", &n, &m, &q);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)scanf("%d", &a[i][j]);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)s[i][j] = s[i][j-1] + s[i-1][j] - s[i-1][j-1] + a[i][j];while (q--){int x1, y1, x2, y2;scanf("%d%d%d%d", &x1, &y1, &x2, &y2);printf("%d\n", s[x2][y2] - s[x2][y1-1] - s[x1-1][y2] + s[x1-1][y1-1]);}return 0;
}

这篇关于前缀和个人见解(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060136

相关文章

Python-算法编程100例-前缀和双指针(入门级)-最长的指定瑕疵度的元音子串

题目描述: 元音字符为“aeiouAEIOU” 给定一个字符串,求字符串中满足指定瑕疵度的最长元音子串的长度。元音子串为字符串中开头和结尾都是元音字符的字符串,瑕疵度为子串中非元音字符的个数。 题目分析: 1、直接使用双指针,难度稍微有些大,边界不好处理。 2、使用前缀和+双指针,题目难度简化。 瑕疵度k=0原始字符串asdbuiodevauufgh元音字符到起始位置的瑕疵度00003

自定义平台后台登录地址前缀的教程

修改平台后台地址默认的 admin 前缀 修改后端 config/admin.php 配置文件,为自定义的后缀 修改 平台后台前端源码中 src/settings.js 文件,修改为和上面一样的配置 修改后重新打包前端代码,并且覆盖到后端的 public 目录下 重启 swoole 服务即可

前缀和+双指针,CF 131F - Present to Mom

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 131F - Present to Mom 二、解题报告 1、思路分析 很经典的一种把列看作cell 来进行双指针/递推的题型 我们考虑,可以预处理出原矩阵中的所有star 然后我们去枚举矩形的上下边界,把边界内的每列当成一个格子的话,问题就变成了求和至少大于等于

【LeetCode刷题】前缀和解决问题:560.和为k的子数组

【LeetCode刷题】Day 16 题目1:560.和为k的子数组思路分析:思路1:前缀和 + 哈希表 题目1:560.和为k的子数组 思路分析: 问题1:怎样找到数组所有子数组? 方式一:暴力枚举出来,以i开始,列出以i开头的所有子数组[i,j](i <= j<= size-1)再i++,列出下一个位置开头的所有子数组。 方式二:前缀和思想,我们用dp[i]来

前缀和算法:算法秘籍下的数据预言家

✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一. 前缀和算法的介绍 二、前缀和例题 2.1 【模版】前缀和 2.2 【模板】二维前缀和  2.3 寻找数组的中间下标  2.4 除自身以外数组的乘积  2.5 和为k的子数组 2.6 和可被k整除的子数组  2.7 连续数组  2.8 矩阵区域和 总结 前言 本篇详细介绍了前缀和算法的使用

小而美的算法技巧:前缀和数组

小而美的算法技巧:前缀和数组 类似动态规划。 class NumArray {private int[] preSum;public NumArray(int[] nums) {preSum=new int[nums.length+1];//preSum[0]的前缀和为0for(int i=1;i<preSum.length;i++){preSum[i]=nums[i-1]+preSum[i-

批量修改图片名称以及自定义前缀

批量修改图片名称代码(“第8排第36列” 修改成8_36 样式)具体想要的名称可修改细节 import osimport redef rename_images(folder_path):# 获取文件夹中所有的文件files = os.listdir(folder_path)# 遍历文件for file_name in files:# 使用正则表达式匹配文件名中的排和列信息match = re

【算法篇】求最长公共前缀JavaScript版本

题目描述 给你一个大小为 n 的字符串数组 strs ,其中包含n个字符串 , 编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。 数据范围: 数据范围:0<n<5000,0<len(strsi)< 5000 进阶:空间复杂度 O(1),时间复杂度 O(n*len) 示例1 输入:[“abca”,“abc”,“abca”,“abc”,“abcc”] 返回值:“abc” 示例

【数据结构】前缀树(字典树)汇总

基础 {“a”,“abc”,“bac”,“bbc”,“ca” }的字典树如下图: 最主用的应用:一,字符串编码。二,位运算。 字符串编码 相比利用哈希映射编码,优点如下: 依次查询长度为n的字符串s的前缀时间复杂度是O(n)。查询完s[0…i],再查询s[0…i+1]的时间复杂度是O(1)。而哈希映射的时间复杂度是:O(nn)。 利用哈希映射编码的代码如下: 注意m_iLeafIndex

信息学奥赛初赛天天练-24-二叉树、N叉树遍历技巧与前缀表达式、中缀表达式、后缀表达式应用实战演练

PDF文档公众号回复关键字:20240609 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 5 根节点的高度为1,一根拥有2023个节点的三叉树高度至少为( )。 A 6 B 7 C 8 D 9 8 后缀表达式 6 2 3 + - 3 8 2 / + * 2 ^ 3 + 对应的中缀表达式是( ) A ((6 - (2 + 3)) * (3 + 8 /