作业介绍

二维前缀和+二维差分

#include<bits/stdc++.h>
using namespace std;
long long n, m, q, a[1005][1005], s[1005][1005], x, y, xx, yy;
//一维前缀和:快速的计算区间和
//s[i]表示前i个数的总和 是s[i]
//s[i]=s[i-1]+a[i]
//二维前缀和:快速地计算  二维数组当中 某一段范围总和
//二维前缀和数组   s[i][j]
//s[i][j]表示a数组的前i行 前j列的总和 是s[i][j]
//s[i][j]=s[i][j-1]+s[i-1][j]-s[i-1][j-1]+a[i][j]
//这个公式要求我们  计算二维前缀和的时候 要从上到下 从左到右开始计算
//如何用二维前缀和  快速的计算某一段范围的总和呢???
//假设我们现在要计算一个小矩形的总和
//这个小矩形 他的左上角坐标是 (x,y) 他的右下角坐标是 (xx,yy)
//s[xx][yy]-s[xx][y-1]-s[x-1][yy]+s[x-1][y-1]
int main(){

}
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int t,n,m,a[N][N],c[N][N];
//二维差分的作用是帮助我们快速的进行区间修改操作
//差分四步走
1.根据原数组 计算出来差分数组
c[i][j]=a[i][j]+a[i-1][j-1]-a[i-1][j]-a[i][j-1]
2.利用差分数组 快速进行区间修改操作
假设我们现在要对一个小矩形  进行加k的操作  左上角的坐标是(x,y) 右下角的坐标是(xx,yy)
c[x][y]+=k
c[xx+1][yy+1]+=k
c[xx+1][y]-=k;
c[x][yy+1]-=k;
3.还原原数组
a[i][j]=c[i][j]-a[i-1][j-1]+a[i-1][j]+a[i][j-1]
4.统计答案

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            c[i][j]=a[i][j]+a[i-1][j-1]-a[i-1][j]-a[i][j-1];
        }
    }

    return 0;
}
状态
已结束
题目
11
开始时间
2026-2-9 0:00
截止时间
2026-2-17 23:59
可延期
24 小时