首页 留言 登录
二维前缀和

将一维前缀和拓展到多维的情形,就是多维前缀和。常见的多维前缀和的求解方法有两种。

第一种,基于容斥原理

输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含x1y1x2y2四个整数,代表一个子矩阵的坐上坐标和右下坐标。

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

输入格式

第一行,输入三个整数nmq

接下来输入n行,每行m个整数

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

输出格式

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

#include <bits/stdc++.h> 
using namespace std;
const int maxn = 1010;
int a[maxn][maxn];
int s[maxn][maxn];

int main(){
    int n,m,q;
    cin>>n>>m>>q;
    memset(s,0,sizeof(s)) ;
    //输入整数矩阵
    for(int i=1;i<=n;++i) {
        for(int j=1;j<=m;++j){
            cin >> a[i][j];
        }
    }
    //预处理,把二维数组s[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;
        int sum = 0;
        cin >> x1 >> y1 >> x2 >> y2;
        sum 
        = s[x2][y2] 
        - s[x2][y1-1]
        - s[x1-1][y2]
        + s[x1-1][y1-1];
        cout << sum << endl; 
    }

} 
上一篇:例6.4定义一个函数check(n,d),如果数字d在正整数n的某位中出现,则返回true,否则返回false
下一篇:一维前缀和
验证码
评论留言 (0条)