AcWing <796. 子矩阵的和>

简介: 二维前缀和总结

image.png

之前讲了一维层面的前缀和数组,这次来讲讲二维的前缀和数组。而每一个位置都表示从起点开始到当前位置之内所有数的和。

image.png

我们也很容易观察到,若我们想要对其进行初始化只需要,用上部分的和加上左部分的和,由于中间部分算了两次由此需要扣掉一次,即s[i,j] = a[i, j] + s[i, j-1] + s[i-1, j] - s[i-1, j-1]。

image.png

初始化之后要求子矩阵的和就只需要用红色部分减去两个绿色的部分,最后把重复减去的部分再加回来就可以了。即 s [x1y1,x2y2] = s[x2,y2] - s[x2,y1-1] - s[x1-1,y2] + s[x1-1,y1-1]

image.png

最后上代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1010;
int a[N][N], s[N][N];
int n, m, q;
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 - 1][j] + s[i][j - 1] - 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;
}

image.gif

目录
相关文章
|
7月前
|
人工智能 SDN
PTA-求3×4数组中大于等于平均值的元素的和
求3×4数组中大于等于平均值的元素的和
93 1
|
7月前
|
C++
【PTA】​L1-048 矩阵A乘以B​ (C++)
【PTA】​L1-048 矩阵A乘以B​ (C++)
75 0
【PTA】​L1-048 矩阵A乘以B​ (C++)
|
7月前
|
C++
【PTA】​ L1-009 N个数求和​ (C++)
【PTA】​ L1-009 N个数求和​ (C++)
239 0
【PTA】​ L1-009 N个数求和​ (C++)
|
机器学习/深度学习 Windows
51nod 1258序列求和
51nod 1258序列求和
81 0
(二维vector)(绝对值求和等式的处理)B. Playing in a Casino
(二维vector)(绝对值求和等式的处理)B. Playing in a Casino
93 0
【每日一题Day40】LC813最大平均值的和分组 | 序列DP
给定数组 nums 和一个整数 k 。我们将给定的数组 nums 分成 最多 k 个相邻的非空子数组 。 分数 由每个子数组内的平均值的总和构成。
100 0
【CCCC】L3-006 迎风一刀斩 (30分),几何关系,找规律 (拼合多边形==斜边等价)
【CCCC】L3-006 迎风一刀斩 (30分),几何关系,找规律 (拼合多边形==斜边等价)
164 0
|
存储
矩阵转置(mooc)用户输入矩阵阶数,然后按行输入所有矩阵元素(整数),将该矩阵转置输出。阶数应是[1,5]之间的整数,不在该区间时,显示“matrix order error”。
矩阵转置(mooc)用户输入矩阵阶数,然后按行输入所有矩阵元素(整数),将该矩阵转置输出。阶数应是[1,5]之间的整数,不在该区间时,显示“matrix order error”。
113 0
CF960F. Pathwalks (树上二维LIS 线段树 动态开点树状数组)
CF960F. Pathwalks (树上二维LIS 线段树 动态开点树状数组)
106 0