干货
二位差分数组的定义与概念

二位差分数组的构建与核心操作

根据二位差分数组来还原原数组

题目练习
法术叠加

cpp
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
int a[1010][1010],d[1010][1010];
int main()
{
cin>>n>>m;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
cin>>a[i][j];
d[i][j] = a[i][j]+a[i-1][j-1]-a[i-1][j]-a[i][j-1];
}
}
int t;
cin>>t;
while(t--)
{
int x1,y1,x2,y2,k;
cin>>x1>>y1>>x2>>y2>>k;
d[x1][y1] += k;
d[x2+1][y2+1] += k;
d[x1][y2+1] -= k;
d[x2+1][y1] -= k;
}
int ma = -999999999;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
a[i][j] = d[i][j]-a[i-1][j-1]+a[i][j-1]+a[i-1][j];
ma = max(ma,a[i][j]);
}
}
cout<<ma<<endl;
for(int i = 1;i<=n;i++)
{
for(int j = 1;j<=m;j++)
{
if(a[i][j]==ma)
{
int sx = i,sy = j;
int ex = i,ey = j;
while(a[sx][ey]==ma&&ey<=m) ey++;
while(a[ex][sy]==ma&&ex<=n) ex++;
int maex = ex,maey = ey;
bool ff = false;
for(ex = maex;ex>=sx;ex--)
{
for(int ey = maey;ey>=sy;ey--)
{
bool f = true;
for(int k = sx;k<=ex;k++)
{
for(int l = sy;l<=ey;l++)
{
if(a[k][l]!=ma)
{
f = false;
break;
}
}
if(f==false) break;
}
if(f==true)
{
ff = true;
cout<<sx<<" "<<sy<<" "<<ex<<" "<<ey<<endl;
}
}
if(ff==true) break;
}
}
}
}
return 0;
}
总结

好了,今天的内容就到这里了。喜欢的话,点个关注呗~