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\) ,那么我们就把他分给第一个,这样最后一定可以抵消。

启发

  • 上面的性质了解一下。
  • 后面也算是一个子问题吧。
posted @ 2022-04-02 16:48  qwq_123  阅读(43)  评论(0编辑  收藏  举报