ARC135D
题面
给一个网格给定一个 \(n\times m\) 的网格,每个格子有一个整数 \(a_{i,j}\),你可以执行任意多次操作。
每次操作选定一个位置 \((i,j)(1≤i<n,1≤j<m)\),再选定一个整数 \(x\),将 \(a_{i,j},a_{i,j+1},a_{i+1,j},a_{i+1,j+1}\) 加 \(x\)。你要使得最终的 \(\sum_{i=1}^n\sum_{j=1}^m a_{i,j}\) 最小。
数据范围:\(n,m\le 500\) 。
题解
你们说有没有一种可能,我是说可能,这种和 \(a_{i,j},a_{i,j+1},a_{i+1,j},a_{i+1,j+1}\) 相关的矩阵题今年会再考一次。
请忽略上面的话。
这题你也要找一个性质:
- 如果设 \(b_i=\sum_{j=1}^m (-1)^{i+j}\times a_{i,j},c_i=\sum_{j=1}^n (-1)^{i+j}\times a_{j,i}\) ,那么给 \(a_{i,j},a_{i,j+1},a_{i+1,j},a_{i+1,j+1}\) 同时加上 \(x\) ,\(b_i,c_i\) 的值是不会改变的!
证明显然,可是在做的时候就是想不到,所以记一下。
然后你现在就需要构造出 \(a'_{i,j}\) ,使满足 \(b,c\) 的限制并且 \(\sum |a'_{i,j}|\) 最小。
因为我们只要让绝对值最小,所以给 \(a_{i,j}\) 乘 \(-1\) 是不会影响我们求最小值的,这样就可以方便处理 \(b,c\) 的限制了。
然后就只需要满足 \(\sum_{j=1}^m a_{i,j}=b_i,\sum_{j=1}^n a_{j,i}=c_i\) 了。
这个的答案就是 \(\max(\sum |b_i|,\sum |c_i|)\) 。
为什么?设 \(\max(\sum |b_i|,\sum |c_i|)=\sum |b_i|\) 。
我们依次考虑第 \(i\) 行,把 \(b_i\) 分给哪些列,发现若当前还有 \(c_j\) 和 \(b_i\) 符号相同的,那么就分给它,让其互相抵消,若 \(c_i=0\) 了就继续找下一个,而 \(b_i=0\) 了则结束。
当然,可能最后 \(b_i\) 还不为 \(0\) ,那么我们就把他分给第一个,这样最后一定可以抵消。
启发
- 上面的性质了解一下。
- 后面也算是一个子问题吧。