IOI2021 集训队作业(一)
有生之年。
233. Rubik's Rectangle
给定一个 \(H \times W\) 的网格,每个网格有个数字,每次操作可以翻转某行或某列,求一组合法操作使得该网格的数字排好序。
时间复杂度:\(O(HW(H+W))\) 。
题解
不妨假设 n, m 都是偶数(如果是奇数那么中间的一行或列可以独立)。
可以发现可以把格子染色,每种颜色恰好四个格子,满足任意翻转操作后颜色矩阵不变。
不妨假设每个数字在正确的颜色位置上。考虑每个颜色内的四个点,可以发现如果这些点构成偶排列那么就总可以在不影响其他颜色的前提下把这四个点排好序,如果是奇排列则总是不能。称每个颜色的左上角的点为代表点,把颜色的排列奇偶性作为标记放到代表点上,对于代表点标记构成的 01 矩阵 A ,如果 A 是全 0 矩阵自然是有解的。
而每次翻转对 A 的影响就是讲某一行或某一列的 01 给全部反转,因此只要能通过这个操作把 A 弄成 01 矩阵就能得到解,这就是个很 simple 的贪心了。
数据
这 spj 真难写。
不难想到如果随机选择一个排列放到网格上,那么极大的概率是无解。采用逆推的方式,从一个排好序的网格随机执行若干次操作得到一个打乱的网格,这样就可以保证数据有解。在此基础上加上一些扰动改变一些代表点的奇偶性即可得到强度较大的无解数据。