题目大意:给nxm和axb的矩阵,每次从nxm矩阵中选择axb子矩阵使每个元素-1,问nxm矩阵能否所有元素为0.
题解:网上找的官方题解
代码:
队友写的...应该不是差分 正解明天补
#include<iostream> #include<string> using namespace std; int a1[1010][1010]; int main() { int t; cin>>t; int n,m,a,b; int i,i1,i2,i3; int c; bool k=0,k1=0; while(t--) { cin>>n>>m>>a>>b; for(i=0;i<n;i++) { for(i1=0;i1<m;i1++) { scanf("%d",&a1[i][i1]); } } int n1=n/a-1; int m1=m-b+1; k=0; for(i=0;i<n1;i++) { for(i1=0;i1<m1;i1++) { if(a1[i*a][i1]>=0) { for(i2=i*a+1;i2<a+i*a;i2++) { if(a1[i2][i1]<a1[i2-1][i1]) { cout<<"QAQ"<<endl; k=1; break; } } if(k) { break; } for(i2=i*a;i2<a+i*a;i2++) { for(i3=i1+b-1;i3>i1-1;i3--) { a1[i2+a][i3]-=a1[i*a+a-1][i1]-a1[i2][i1]; } } for(i2=i*a;i2<a+i*a;i2++) { for(i3=i1+b-1;i3>i1-1;i3--) { a1[i2][i3]-=a1[i2][i1]; } } } } if(k) { break; } } if(k) { k=0; continue; } for(i1=0;i1<m1;i1++) { if(a1[i*a][i1]>=0) { for(i2=i*a+1;i2<i*a+n%a+1;i2++) { if(a1[i2][i1]<a1[i2-1][i1]) { cout<<"QAQ"<<endl; k=1; break; } } if(k) { break; } for(;i2<i*a+a;i2++) { if(a1[i2][i1]!=a1[i2-1][i1]) { cout<<"QAQ"<<endl; k=1; break; } } if(k) { break; } for(i2=i*a;i2<i*a+n%a+1;i2++) { for(i3=i1+b-1;i3>i1-1;i3--) { a1[i2+a][i3]-=a1[i*a+a-1][i1]-a1[i2][i1]; // cout<<i2+a<<' '<<i3<<' '<<i*a+a-1<<' '<<i1<<' '<<i2<<' '<<i1<<endl; // cout<<a1[i2+a][i3]<<' '<<a1[i*a+a-1][i1]<<' '<<a1[i2][i1]<<endl; } } for(i2=i*a;i2<a+i*a;i2++) { for(i3=i1+b-1;i3>i1-1;i3--) { a1[i2][i3]-=a1[i2][i1]; } } } } if(k) { k=0; continue; } for(i=0;i<n;i++) { for(i1=0;i1<m;i1++) { if(a1[i][i1]) { k=1; } // cout<<a1[i][i1]<<' '; } // cout<<endl; } if(k) { k=0; cout<<"QAQ"<<endl; } else { cout<<"^_^"<<endl; } } }