[CF321D]Ciel and Flipboard
壹、题目描述 ¶
贰、题解 ¶
首先 \(m\overset\Delta=\frac{n+1}{2}\),有个最暴力的想法:枚举左上角 \(m\times m\) 的小正方形,然后计算正方形的价值。
然而,有一个最基础的性质 —— 无论我们如何操作,\((m,m)\) 的格子是一定会被操作的。
这个特性似乎并没有什么卵用,但是它启发了我们考察每一行、每一列中间的那个格子,与其他格子之间,操作会发生什么事情。
不妨先考察同一行,设该行为 \(r\),那么,不难发现,如果我们的操作涵盖了第 \(r\) 行,那么 \((r,m)\) 是一定会被操作的。然而,存在一个更强的性质 —— 由于 \(m\) 刚好是 \(n\) 的一半多一个,所以,对于两个对应的格子 \((r,c)(c<m)\) 与 \((r,c+m)\),这两个格子不可能在一个操作中被同时翻转。
若记 \(f(i,j)\) 表示最终该格子是否被翻转,那么
于是,我们可以只需要枚举中间的一行一列,就可以根据对应的四个格子 \((r,c),(r+m,c),(r,c+m),(r+m,c+m)\) 如何取,贪心地选择最大值。
不过,这样的复杂度为 \(\mathcal O(2^{2n})\),如果你注意到,我们实际上只需要枚举中间一行一列的前 \(m\) 个,复杂度也是 \(\mathcal O(2^n)\) 级别,仍然不足以通过,不过,若我们已经枚举了 \((m,1),(m,2),\cdots,(m,m)\),那么我们实际上可以直接贪心地看第 \(r\) 行对应的中间点 \((r,m)\),看一看第 \(r\) 行与第 \(r+m\) 行应该如何取是最大的,而不用枚举。
此时,复杂度就降至 \(\mathcal O(m^22^m)\),足以通过。
不过并没有代码。