[CF321D]Ciel and Flipboard

壹、题目描述 ¶

  传送门 to CF.

贰、题解 ¶

  首先 \(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)\) 表示最终该格子是否被翻转,那么

\[f(r,c)\oplus f(r,m)\oplus f(r,c+m)=0 \]

  于是,我们可以只需要枚举中间的一行一列,就可以根据对应的四个格子 \((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)\),足以通过。

  不过并没有代码。

posted @ 2021-10-21 11:17  Arextre  阅读(50)  评论(0编辑  收藏  举报