QOJ 8892 Power Grid 题解

Link

神仙构造。

\(X_i = \sum_{j = 1}^{m} a_{i, j}, Y_j = \sum_{i = 1}^{n} a_{i, j}\),由于“一行的总用电量与一列的总用电量的差值的绝对值”,所以 \(c_{i, j} = |X_i - Y_j|\)。尝试通过确定 \(X, Y\) 来确定 \(a\),当 \(\sum_{1 \leq i \leq n} X_i = \sum_{1 \leq j \leq m} Y_j\) 时有如下构造 \(a\) 的方法:

  • \(a_{1 \leq i \lt n, m} \leftarrow X_i\)
  • \(a_{n, 1 \leq j\lt m} \leftarrow Y_j\)
  • \(a_{n, m} \leftarrow X_n + Y_m - \sum X\)
  • \(a_{1 \leq i \lt n, 1 \leq j \lt m} \leftarrow 0\)

这是常见的控制并特殊化的构造技巧。此时每个 \(1 \leq i \lt n\) 对应的行和都是 \(X_i\),同理每个 \(q \leq j \lt m\) 对应的列和都是 \(Y_j\),此时第 \(n\) 行之和为 \(\left( \sum_{j = 1}^{m - 1} Y_j \right) + X_n + Y_m - \left( \sum_{i = 1}^{n} X_i \right) = X_n\),还是同理可算第 \(m\) 列和为 \(Y_m\)

考虑构造 \(X, Y\) 的方法?令一个位置 \(c_{x, y}\) 取到 \(\max\),那 \(c_{x, y}\) 要么是行中极大减去列中极小,要么是列中极大减去行中极小。我们认定前者,同时钦定 \(X_x = c_{x, y}, Y_y = 0\)。由于 \(Y \geq 0\),所以对于 \(j \neq y\)\(Y_j = X_x - c_{x, j}\)。对于后者,显然只需要做完前者之后转置 \(a\) 重新做一遍就可以了。

对于 \(i \neq x\) 考虑 \(X_i\) 的取值,由于 \(c_{i, y} = |X_i - Y_y| = |X_i|\),所以 \(X_i = \pm c_{i, y}\),即通过自身与其他的 \(c_{i, j}\) 可以推导出 \(X_i\) 的取值情况为无/恰好有 \(1\) 种/恰好有 \(2\) 种。如果 \(X_i\) 不存在合法取值则当前情况无解。考虑怎么继续限制这个有两种情况的 \(X_i\)

由于我们只钦定了 \(Y_y = 0\),考虑调整 \(Y_y\) 等于其他非 \(0\),但是要满足能构造出 \(c\),所以只能和 \(X\) 一起整体加减 \(k\)。此时 \(\sum X - \sum Y\) 会增加 \(k(n - m)\),由于 \(\sum X - \sum Y = 0\),所以钦定 \(Y_y = 0\) 之后,要令 \(\sum X - \sum Y \equiv 0 (\bmod |n - m|)\)

然后对满足条件的某一组 \(X\) 的求解方法是背包。对于有两种合法情况 \(p, q\)\(X_i\),依旧钦定 \(p \leq q\),令 \(X_i \leftarrow p\),然后将一个体积 \(V = q - p\) 的物品丢进背包里,现在所有的 \(X, Y\) 都有具体值但是不保证合法,用背包内元素凑出所有可能的 \(V\)\(S\) 满足 \(S \equiv \sum X - \sum Y (\bmod |n - m|)\),根据 \(S\) 反推每个 \(X\) 的具体值。具体地,令 \(f(i, j)\) 表示考虑前 \(i\) 个物品,能否选出若干个物品使得体积为 \(j\)。逆推时,若 \(f(i - 1, S) = 0\) 则第 \(i\) 个物品对应的 \(X\) 的取值需要修改为当前物品的 \(q\),令 \(S \leftarrow S - q\)。这里还需要 std::bitset 把背包的 \(O(nV)\) 值域范围压到 \(O(\frac{n^2 V}{w})\)

posted @ 2025-11-13 09:16  夢回路  阅读(6)  评论(0)    收藏  举报