链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
给你一个 n 行 m 列的矩阵 A ,下标从1开始。
接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2
请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和。
输入描述:
第一行包含三个整数n,m,q. 接下来n行,每行m个整数,代表矩阵的元素 接下来q行,每行4个整数x1, y1, x2, y2,分别代表这次查询的参数 1≤n,m≤10001 \le n, m \le 10001≤n,m≤1000 1≤q≤1051 \le q \le 10^51≤q≤105 −109≤a[i][j]≤109-10^9 \le a[i][j] \le 10^9−109≤a[i][j]≤109 1≤x1≤x2≤n1 \le x_1 \le x_2 \le n1≤x1≤x2≤n 1≤y1≤y2≤m1 \le y_1 \le y_2 \le m1≤y1≤y2≤m
输出描述:
输出q行,每行表示查询结果。
输入
3 4 3
1 2 3 4
3 2 1 0
1 5 7 8
1 1 2 2
1 1 3 3
1 2 3 4
输出
8
25
32
答案:
#include<iostream>
using namespace std ;
const int N=1010 ;
typedef long long ll ;
ll a[N][N] ,b[N][N] ;
int main()
{
int n ,m ,q ;
cin >> n >> m >> q ;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin >> a[i][j] ;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+a[i][j] ;
while(q--)
{
int x1,y1,x2,y2 ;
cin >> x1 >> y1 >> x2 >> y2 ;
cout << b[x2][y2]-b[x1-1][y2]-b[x2][y1-1]+b[x1-1][y1-1]<<endl ;
}
}
解释:
在求二维前缀和时类似于求区域面积,当我们求整体面积时即红黄蓝绿四个颜色的和用前缀和的形式表现即红色加绿色加上绿色加蓝色减去重复相加的面积即绿色再加上黄色即可算下绿色为左上角黄色为右下角的整体方块颜色;
用代码表达即
b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+a[i][j]
当我们求某一子区域的面积可以利用整体减去部分的方法 ;我们可以将其他部分忽略类似于上面求整体的算法但此时因为要计算子区域的面积需要用减法,此时多减去的红色区域就需要加上
b[x2][y2]-b[x1-1][y2]-b[x2][y1-1]+b[x1-1][y1-1]