题解:P9731 [CEOI2023] Balance

· · 题解

MX-WF-C 8.14 最难题。

题意

给定一个 n \times s 的矩阵。保证 s2 的幂。你需要给出一种将矩阵的每一行重排的方案,使得对于每个矩阵中出现的数而言,在所有列中的出现次数的极差 \le 1

做法

首先考虑 s = 2。不妨设这个矩阵形如 [[u_1,v_1],[u_2,v_2]\dots[u_n,v_n]]

我们考虑将每个 u_i, v_i 连无向边。我们断言,答案为给所有边定向,使得每个点的入度与出度的差的绝对值都 \le 1 的方案数。

我们考虑一组答案与上述构造的映射关系。对于一条边而言,如果形如 u_i \to v_i,则将这一行的两个数交换(即 [v_i, u_i])。否则如果 u_i \gets v_i,则这一行保持不变(即 [u_i,v_i])。那么一个数被放在左边的行数即这个点的入度,右边的行数即出度。所以我们需要保证任意一个点的入度与出度的差的绝对值都 \le 1

对于新问题,不难想到欧拉路的一系列东西。

若图中任意一点的度数均为偶数,那么我们对于每个连通块都求一遍欧拉回路。可以证明这样的情况下欧拉回路一定存在。那么我们可以根据这条欧拉回路轻易的构造出边的定向方案,且每个点的出度均等于入度。

若图中存在若干个点的度数为奇数。我们建一个 super 点与这些度数为奇数的点连边。可以证明度数为奇数的点的数量一定为偶数(因为所有点的度数和是边数的两倍,是个偶数,所以去除掉所有度数为偶数的点后,剩下的度数为奇数点的度数和也是偶数),即这个 super 点的度数为偶数。

所以这张新图就满足了上一种情况(即所有点的度数均为偶数)。跑一边欧拉回路,再将 super 点去掉即答案。这是因为原来的所有度数为奇数的点,在新图中满足了入度等于出度,所以去掉它的一个度之后,入度出度差至多为 1

至此我们解决了 s = 2 的情况。考虑更一般的问题。

分而治之好!设 s = 2^k。我们考虑将矩阵的每一行变形:

a_{i,1}&a_{i,2}&\cdots&a_{i,2^{k-1}}&a_{i,2^{k-1} +1 }&\cdots&a_{i,2^k} \end{bmatrix} \longrightarrow \begin{bmatrix} a_{i,1} & a_{i,2^{k-1}+1} \\ a_{i,2} & a_{i,2^{k-1}+2} \\ \vdots & \vdots \\ a_{i,2^{k-1}} & a_{i,2^k} \end{bmatrix}

然后对于这个新矩阵执行上面的算法。换言之我们连边所有 a_{i,j}, a_{i,j+2^{k-1}} 然后跑欧拉回路。

发现这样做我们能保证每个数字在 a_{1\sim n,1 \sim 2^{k-1}} 中的出现次数与在 a_{1\sim n, 2^{k-1}+1\sim 2^k} 中的出现次数相差至多 1。然后递归处理 [1,2^{k-1}][2^{k-1}+1, 2^k] 即可。