• acwing796. 子矩阵的和


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

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

    输入格式

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

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

    接下来 q 行,每行包含四个整数 x1,y1,x2,y2,表示一组询问。

    输出格式

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

    数据范围

    1≤n,m≤1000,
    1≤q≤200000,
    1≤x1≤x2≤n,
    1≤y1≤y2≤m,
    −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
    

    方法一:

    类似一维数组求其区间元素和,将前缀和的思想运用到二维数组(盲猜甚至可以用到多维数组,比如三位空间的部分和)

    借用一下acwing某位大佬的题解图示

    前缀和.png

    #include <bits/stdc++.h>
    using namespace std;
    
    int n, m, q, X1, Y1, X2, Y2;
    int matrix[1010][1010];
    
    int main() {
        memset(matrix, 0, sizeof(matrix));
        scanf("%d%d%d", &n, &m, &q);
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                scanf("%d", &matrix[i][j]);
                matrix[i][j] += matrix[i-1][j] + matrix[i][j-1] - matrix[i-1][j-1];
            }
    
        }
        for (int i = 0; i < q; i++) {
            scanf("%d%d%d%d", &X1, &Y1, &X2, &Y2);
            printf("%d\n", matrix[X2][Y2] - matrix[X2][Y1-1] - matrix[X1-1][Y2] + matrix[X1-1][Y1-1]);
        }
    }
    
  • 相关阅读:
    Repo介绍
    =vscode========》快捷键
    linux c延时程序大全
    Linux vi/vim
    =vscode========》实用小技巧
    编程中闰年判断条件
    代码质量的评价标准
    Python如何计算编辑距离?
    python 格式化输出保留一位小数
    字符串拆分 split()方法
  • 原文地址:https://www.cnblogs.com/nosae/p/15827427.html
Copyright © 2020-2023  润新知