题目链接
题解:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int dp[1001][1001]; //差分记录
int su[1001][1001]; //输入的值
int rec[1001][1001]; //记录差分和
void inse(int x,int y,int x1,int y1,int z)
{
dp[x][y]+=z;
dp[x1+1][y]-=z;
dp[x][y1+1]-=z;
dp[x1+1][y1+1]+=z;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m,a,b;
cin>>n>>m>>a>>b;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
cin>>su[i][j];
dp[i][j]=0;
rec[i][j]=0;
}
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
rec[i][j]= dp[i][j]+rec[i-1][j] + rec[i][j-1] - rec[i-1][j-1]; //记录差分和
if((i+a-1<=n)&&(j+b-1<=m))
{
su[i][j]+=rec[i][j];
rec[i][j]-=dp[i][j]; //因为接下来dp[i][j]的值会改变 所以会影响差分和
if(su[i][j]>0) inse(i,j,i+a-1,j+b-1,-su[i][j]);
rec[i][j]+=dp[i][j]; //加上dp[i][j]修改之后的值
su[i][j]=0;
}
}
}
int flag=1;
for (int i=1;i<=n;i++)
{
if(!flag) break;
for (int j=1;j<=m;j++)
{
if((i+a-1>n)||(j+b-1>m))
{
su[i][j]+=rec[i][j];
if(su[i][j]!=0)
{
flag=0;
cout<<"QAQ"<<endl;
break;
}
}
}
}
if(flag) cout<<"^_^"<<endl;
}
}