[半成品]T1320 子矩阵求和

作者:波纹飞鱼

[半成品]T1320 子矩阵求和

本博客仅为半成品,仅仅是提供一个简单的子矩阵求和的思路。本程序所需时间和所占内存过大,无法应用于有时间限制的实际题目

题目

给出一个nm列的矩阵,矩阵的每个位置有一个非负整数a[i][j],有q次询问,每次询问求一个左上角为(a,b),右下角为(c,d)的子矩阵的所有数之和。

输入格式

第一行两个整数n,m,表示矩阵的行和列的大小。
接下来n行每行m个整数,为矩阵内容。
接下来一行为一个整数q,表示询问次数。
接下来q行每行4个整数a,b,c,d,含义见题面。

输出格式

q行,第i行为第i个询问的答案。

数据范围

n×m≤100,000a[i][j]≤1000q≤100,0001≤a≤c≤n1≤b≤d≤m

解题

一,流程图

Created with Raphaël 2.2.0 开始 输入矩阵 输入询问次数 输入子矩阵位置 提取子矩阵 计算子矩阵的所有数之和 输出子矩阵的所有数之和 结束

二,提取关键点

1.矩阵的存储
2.提取子矩阵
3.计算子矩阵的所有数之和

三,解决关键点

1.矩阵的存储

for循环与for循环嵌套,从第一行开始,依次输入每一个数据,一行输入完毕后换行,开始下一行每个数据的输入,以此类推,直到数据全部输入完毕。

2.提取子矩阵

设左上角坐标(x1,y1),右下角坐标(x2,y2
for循环与for循环嵌套,从左上角坐标的行(x1)与列(y1)开始,依次提取每一个数据,到右下角坐标的列(y2)结束,进入下一行,从左上角坐标的列(y1)开始,依次提取每一个数据,再到右下角坐标的列(y2)结束,以此类推,直到抵达右下角坐标的行(x2)与列(y2),则提取完毕。

3.计算子矩阵的所有数之和

定义一个空变量,赋初值0。提取子矩阵时,每提取一个数据,便加上此数据。子矩阵提取完毕后,输出最终变量,并且在输出后归零,进入下一个子矩阵的循环。

编程

#include
using namespace std;
int main()
{
    long n,m,i,j,k,a[1001][1001],q,z1[100001],z2[100001],z3[100001],z4[100001],d=0;
    cin>>n>>m;
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            cin>>a[i][j];
        }
    }
    cin>>q;
    for(k=0;k<q;k++){
        cin>>z1[k]>>z2[k]>>z3[k]>>z4[k];
    }
    for(k=0;k<q;k++){
        for(i=z1[k]-1;i<z3[k];i++){
           for(j=z2[k]-1;j<z4[k];j++){
            d+=a[i][j];
           }
        }
    cout<<d<<endl;
    d=0;
    }
    return 0;
}

你可能感兴趣的:(第一届信奥竞赛冬令营,笔记)