题解 | #【模板】二维差分#
【模板】二维差分
https://www.nowcoder.com/practice/50e1a93989df42efb0b1dec386fb4ccc
#include<bits/stdc++.h>
using namespace std;
long long a[1010][1010],dp[1010][1010];
int main(){
int n,m,q;
cin>>n>>m>>q;
int x1,y1,x2,y2,k;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>a[i][j];
}
for(int i=0;i<q;++i){
dp[j][y1]+=k;
dp[j][y2+1]-=k;
}//按行进行分次操作,a[j][y1] 加 k ,a[j][y2+1]减 k ,做一个前缀和之后,相当于 [y1,y2] 区间内每个数都加上了 k 。
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
dp[i][j]+=dp[i][j-1];//前缀整合后得到最终的操作总和
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cout<<a[i][j]+dp[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
using namespace std;
long long a[1010][1010],dp[1010][1010];
int main(){
int n,m,q;
cin>>n>>m>>q;
int x1,y1,x2,y2,k;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>a[i][j];
}
}
cin>>x1>>y1>>x2>>y2>>k;//每输入一次进行一次操作
for(int j=x1;j<=x2;++j){dp[j][y1]+=k;
dp[j][y2+1]-=k;
}//按行进行分次操作,a[j][y1] 加 k ,a[j][y2+1]减 k ,做一个前缀和之后,相当于 [y1,y2] 区间内每个数都加上了 k 。
}
for(int j=1;j<=m;++j){
dp[i][j]+=dp[i][j-1];//前缀整合后得到最终的操作总和
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cout<<a[i][j]+dp[i][j]<<" ";
}
cout<<endl;
}
return 0;
}