题目链接:https://ac.nowcoder.com/acm/contest/7501/J
题意:给定一个n*m的数组,可对规格为a*b的数组进行无限减一操作,问是否能使得n*m数组元素全部为0。
思路:先将原数组变为差分数组,若差分数组有元素大于0,我们可以以这个元素为a*b数组的左上角对其进行减掉自身的操作。若小于0,则不满足条件。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 1005
ll M[maxn][maxn],pre[maxn][maxn];
void antisum(ll i,ll j,ll in,ll jn,ll num){
pre[i][j]+=num;
pre[in][j]-=num;
pre[i][jn]-=num;
pre[in][jn]+=num;
}
int main(){
ll t,n,m,a,b,i,j,f=0;
cin>>t;
while(t--){
memset(pre,0,sizeof(pre));
cin>>n>>m>>a>>b;
f=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
cin>>M[i][j];
pre[i][j]=M[i][j]+M[i-1][j-1]-M[i][j-1]-M[i-1][j];
}
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
int tmp=pre[i][j];
if(!tmp)
continue;
else if(tmp<0){
f=1;
break;
}
else if(i<=n-a+1&&j<=m-b+1){
pre[i][j] -= tmp;
pre[i][j+b] +=tmp;
pre[i+a][j] +=tmp;
pre[i+a][j+b] -= tmp;
}
else{
f=1;
break;
}
}
}
if(f) cout<<"QAQ"<<endl;
else cout<<"^_^"<<endl;
}
return 0;
}