二维前缀和
pre[i][j]=pre[i-1][j]+pre[i][j-1]+a[i][j]-pre[i-1][j-1]
一维差分要修改2个位置即(l->r)
p[l]+=x
p[r+1]-=x
二维差分要修改4个位置即(i,j)->(x,y)
p[i][j]+=x
p[x+1][j]-=x
p[i][y+1]-=x
p[x+1][y+1]+=x
#include <bits/stdc++.h>
using namespace std;
int n,m;
class Solution {
public:
bool possibleToStamp(vector<vector<int>>& vee, int a, int b) {
n=vee.size();
m=vee[0].size();
int v[n+2][m+2];
int cp[n+2][m+2];
int pre[n+2][m+2];
int sum[n+2][m+2];
memset(v,0,sizeof(v));
memset(pre,0,sizeof(pre));
memset(cp,0,sizeof(cp));
memset(sum,0,sizeof(sum));
for(int i=0;i<n;i++){for(int j=0;j<m;j++){v[i+1][j+1]=vee[i][j];}}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+v[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int nx=i+a-1;
int ny=j+b-1;
if(nx>n||ny>m){continue;}
int uu=pre[nx][ny]-pre[nx-a][ny]-pre[nx][ny-b]+pre[nx-a][ny-b];
if(uu==0)
{
cp[i][j]+=1;
cp[nx+1][j]+=-1;
cp[i][ny+1]+=-1;
cp[nx+1][ny+1]+=1;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+cp[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
v[i][j]+=sum[i][j];
if(v[i][j]==0){return false;}
}
}
return true;
}
};