属于构造反证
先设A[I] = 0 , 那么我们就可以出b[i], 并且0 <= b[i] < k, 然后再根据w[i][1] = a[i] + b[1] -> a[i] = w[i][1] - b[1] 并且 -k < a[i] < k ;
所以 -k< a[i] + b[i] < 2*k 假设这个结果正确的话, 那么 w[i][j] - a[i] - b[j] 的绝对值 等于k 或者 零,
如果所有的 w[i][j] - a[i] - b[j]都等于零, 那么k 就是一个无穷大就好了,
如果 w[i][j] - a[i] - b[j] != 0 那么这个结果只可能是K,
然后再反过来验证下 w[i][j] 是不是都小于K就好了
#include <iostream>
#include <stdlib.h>#include <stdio.h>
#include <string.h>
using namespace std;
#define LL long long
#define INF 1e18
LL w[111][111];
LL tem[111][111];
LL a[111];
LL b[111];
int main()
{
LL n,m,k;
scanf("%lld %lld",&n, &m);
for( LL i = 1; i <= n; i++)
for( LL j = 1; j <= m; j++)
scanf("%lld",&w[i][j]);
a[1] = 0;
for( LL i = 1; i <= m; i++)
b[i] = w[1][i];
for( LL i = 2; i <= n; i++)
a[i] = w[i][1] - b[1];
bool flag = false;
bool ok = false;
for( int i = 1; i <= n; i++)
{
for( int j = 1; j <= m; j++)
{
if(a[i] + b[j] < 0)
tem[i][j] = w[i][j] - a[i]- b[j];
else
tem[i][j] = a[i] + b[j] - w[i][j];
if(tem[i][j])
flag = true;
}
}
if(!flag)
k = (LL)INF, ok = true;
else
{
k = 0, ok = true;
for( int i = 1; i <= n; i++)
{
for( int j = 1; j <= m; j++)
{
if(tem[i][j])
{
if(k && k != tem[i][j])
{
ok = false;
break;
}
k = tem[i][j];
}
}
}
}
for( LL i = 1; i <= n; i++)
for( LL j = 1; j <= m; j++)
{
if(w[i][j] >= k)
ok = false;
}
if(!ok)
printf("NO\n");
else
{
printf("YES\n");
printf("%lld\n",k);
for( int i = 1; i < n; i++)
printf("%lld ",a[i] < 0? a[i] + k: a[i]);
printf("%lld\n",a[n] < 0? a[n] + k: a[n]);
for( int i = 1; i < m; i++)
printf("%lld ",b[i]);
printf("%lld\n",b[m]);
}
}