二维前缀和【模板】

链接:登录—专业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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值