一.简介
二维差分是一种用于计算二维数据矩阵中相邻元素之间差异的方法。它可以帮助我们分析二维数据的变化趋势和模式。
二维差分的计算方法类似于一维差分,对于一个二维数据矩阵X,其差分矩阵Y的第(i, j)个元素可以通过以下公式计算得到:
Y[i, j] = X[i+1, j] - X[i, j] + X[i, j+1] - X[i, j]
这样,差分矩阵Y的尺寸将比原始矩阵X的尺寸少1行和1列。差分矩阵Y中的元素表示了原始矩阵X中相邻元素之间的差异。
需要注意的是,二维差分是一种简单的方法,可能无法捕捉到原始数据中的复杂模式。在某些情况下,可能需要使用更高级的技术和算法来分析二维数据。
二.变化通式
一个差分矩阵为d[x][y],则区域内+1则为(x1,y1为左上角坐标,x2,y2为右下角坐标)
d[x1][y1]+=1 ; d[x1][y2+1]-=1 ; d[x2+1][y1]-=1 ; d[x2+1][y2+1]+=1 ;
三.求原矩阵:
b[i][j]=b[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
四.题目
P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
五.参考代码
#include<bits/stdc++.h>
#define maxn 1005
using namespace std;
int n,m;
int b[maxn][maxn]; //二维差分
int main(){
cin>>n>>m;
while(m--){
int x1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
//差分通式
b[x1][y1]+=1;b[x1][y2+1]-=1;b[x2+1][y1]-=1;b[x2+1][y2+1]+=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
//sum
b[i][j]=b[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1];
cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}