Solution -「构造」专练
记录全思路过程和正解分析。全思路过程很 navie,不过很下饭不是嘛。会持续更新的(应该)。
「CF1521E」Nastia and a Beautiful Matrix
Thought.
要把所有数容纳下就一定至少有,\(\sum \limits _{i = 1 \to k} a_i < n^2\)。但这个限制太弱了可恶。
考虑一种构造,一排全放数字,一排隔一个放一个。感觉可以做到最优。
接下来考虑普适化的细节,即需要满足对角线数组不同。
全放数字的就直接往上怼,不够换下一个数字,顺序填即可。
全放数字的不妨均为奇数行,则隔一个放一个的为偶数行,在所有奇数行确定后再填。从下往上,只有能填就填。
但我们没有确定 \(n\) ?如果一个矩阵按理想情况填满应该能装:
而需要最大容量的数字拥有方案应该是全部都是一个数,比如 \(10^5\) 个 \(1\) 啥的。
而这种情况只能一行全放,一行全空。此时一个矩阵可以装:
如果一个 \(n\),\(s.t. g(n) \leq \sum \limits _{i = 1 \to n} a_i \leq f(n)\),则有几率可以。感觉这样的 \(n\) 没多少啊?那就枚举。
假设共 \(x\) 个数,不难发现 \(f(n)\),\(g(n)\) 对于同奇偶的 \(n, n \geq 1\) 分别单增。
那么就从 \(n = \frac {\sqrt {4x - 1}} {3}\) 开始枚举,一直到 \(n = \sqrt {2x}\)。试一下吧?
G 了。Hack 数据:
1
25 3
12 10 3
Solution.
一行填满,一行隔一个填一个的思路是对的。
但并不是按顺序能填就填,因为在这样的逻辑中,只能填下 \(n \times \lceil \frac {n} {2} \rceil\) 个同种类的数,不然就会破坏规则二。
(可使用抽屉原理证明。
而 \(n^2 - \lfloor \frac {n} {2} \rfloor^2\) 是这样填最多可以有多少个非零的数填入。
故可以得出 \(n^2 - \lfloor \frac {n} {2} \rfloor^2 \geq m\),\(n \times \lceil \frac {n} {2} \rceil \geq \max \limits _{i = 1 \to n} a_i\)。但这充分吗?
Two thousand years later...
充分。
我们考虑按以下方式构造,按从数字个数从大到小的顺序依次将对应数字填入这些格子:
- 第一类:横坐标为奇数,纵坐标为偶数。
- 第二类:横坐标为奇数,纵坐标为奇数。
- 第三类:横坐标为偶数,纵坐标为奇数。
(允许最后一类不填。
那么会破坏第二个限制的就是第一类格子的数和相邻的第三类格子的数相同。
而第一类格子填入的最后一个数是第 \(\lceil \frac {n} {2} \rceil \times \lceil \frac {n} {2} \rceil\) 个填入的,第三类格子填入的第一个数是第 \(n \times \lceil \frac {n} {2} \rceil + 1\) 个填入的。
若假设会相同,那么第一类格子应全是这个相同的数 \(x\)。
因为如果不是 \(x\),则有另一个数 \(y\) (\(y\) 应比 \(x\) 后填入)跨越了第一类和第三类,\(y\) 的个数至少为 \(n \times \lceil \frac {n} {2} \rceil - \lceil \frac {n} {2} \rceil \times \lceil \frac {n} {2} \rceil + 2\) ,而 \(x\) 的数个数至多为 \(\lceil \frac {n} {2} \rceil \times \lceil \frac {n} {2} \rceil - 1\)。
因为 \(n \times \lceil \frac {n} {2} \rceil - \lceil \frac {n} {2} \rceil \times \lceil \frac {n} {2} \rceil + 2 = \lceil \frac {n} {2} \rceil \times \lfloor \frac {n} {2} \rfloor + 2\) 且 \(\lceil \frac {n} {2} \rceil \times \lfloor \frac {n} {2} \rfloor + 2 - (\lceil \frac {n} {2} \rceil \times \lceil \frac {n} {2} \rceil - 1) = \lceil \frac {n} {2} \rceil \times (1 / 0) + 3 > 0\),所以 \(n \times \lceil \frac {n} {2} \rceil - \lceil \frac {n} {2} \rceil \times \lceil \frac {n} {2} \rceil + 2 > \lceil \frac {n} {2} \rceil \times \lceil \frac {n} {2} \rceil - 1\) 。而这与按照数字个数从大到小的顺序矛盾。
故第一类应全是 \(x\),因为是按顺序且第三类的第一个也是 \(x\),那么说明这个数的个数至少为 \(n \times \lceil \frac {n} {2} \rceil + 1\),这与 \(n \times \lceil \frac {n} {2} \rceil \geq \max \limits _{i = 1 \to n} a_i\) 矛盾。
故第一类格子的数和相邻的第三类格子的数不可能相同。
哇这谁想得到。
「CF1391E」Pairs of Pairs
Thought & Solution.
难道说……子任务 \(2\) 就是找 \(\frac { \lceil \frac {n} {2} \rceil } {2}\) 对点互相没有连边?!
子任务 \(1\) 的指向极为明显,考虑在原图中跑 DFS ,按照 DFS 序,拉出一棵 DFS 树。若深度 \(\geq \lceil \frac {n} {2} \rceil\),则子任务 \(1\) 有解。
否则,完成子任务 \(2\)。易知原图中有两点 \(u, v\) 间有边为 \(u, v\) 在 DFS 中存在祖孙关系的充要条件(与有向图 Tarjan 类似。
也就是说我们要找 \(\frac { \lceil \frac {n} {2} \rceil } {2}\) 对点互相不存在祖孙关系。
容易的。可以将同一深度将相邻的点配对,最后最多剩下 \(1\) 个点。因为最大深度 \(< \lceil \frac {n} {2} \rceil\),所以剩下的点数 \(< \lceil \frac {n} {2} \rceil\) ,即配对的点数 \(> n - \lceil \frac {n} {2} \rceil = \lfloor \frac {n} {2}\rfloor\),故可知在子任务 \(1\) 无法完成时,按这种方法构造子任务 \(2\) 一定有解。
合理的,能够通过的。
「CF1592F1」Alice and Recoloring 1
Thought.
不难发现对于目标矩阵的任意全是 \(B\) 的子矩阵,若不包含 \(4\) 个角,则都可以使用至多 \(4\) 次操作 #1 单独构造出来且不影响其他子矩阵(如果贴在边缘则仅需 \(2\) 次)。
但这不好做啊,因为子矩阵可以相互用部分去组合。
然后发现 #2、#3 两种操作是废的,因为操作 #2 可以用两个操作 #1 完成,费用为 \(2\);操作 #3 也可以用两个操作 #1 完成,费用为 \(2\)。
但这仍然不好做,并不能产生构成方案的动机。开始构思一些神妙做法了。
比如我们可以单独考虑执行操作 #1 \((i, j)\),则可以同时清理整个 \(i:1 \to i, j: 1 \to j\) 里的 B
……这是句废话。
好啦我不会。
Solution.
继续反直觉,从上面的思路往下走。我们考虑只使用 #1,且令 B
为 \(1\),W
为 \(0\)。
当一个位置 \((i, j)\) 需要使用 #1 变为 \(1\) 时,代表它现在的状态是 \(0\)。即存在本身是 \(0\)、处理 \((i, j + 1),(i + 1, j),(i + 1, j + 1)\) 时使用了偶数次 #1 使得 \((i, j)\) 仍为 \(0\) 两种情况。
同理考虑需要使用 #1 变为 \(0\) 的情况。
可以得出如果 \((i, j) \space \mathrm{xor} \space (i, j + 1) \space \mathrm{xor} \space (i + 1, j) \space \mathrm{xor} \space (i + 1, j + 1) = 1\),则需要执行 #1;否则就不需要。如果记一个新的矩阵 $a(i, j) = $ 前面那一坨异或和,则 #1 可以每次让一个位置翻转,多次使用使矩阵达到目的。
那么我们就可以只用 #1 构造出一个合法方案,但应该是可以继续用 #4 进行优化的。
#4 淦了个啥?将 \(a(i, j), a(i, m), a(n, j), a(m, n)\) 同时一次性翻转。对于 \(a(m, n)\),以后可能会重复受作用,所以直观上,#4 应该只用一次最赚。有谁会详细证明嘛,先留个坑。
「CF1519E」Off by One
Thought & Solution.
平推流好费脑子啊,原来内部练习都习惯乱开的。(然后难一点的都放了可恶。所以平推要尽量坚持。
判断两点是否可以执行移动并删除是很容易的。我们可以先将所有可以直接删除的点对连边,那么答案就转化为无向图的最大边独立集。
然后会发现边是 \(n ^ 2\) 级别的,并且这个边独立集也很难做,G。
对于一个点 \((x, y)\),将它与两个表示斜率 \(\frac {x + 1} {y},\frac {x} {y + 1}\) 的点相连。则原问题转化为求一个最大匹配,定义匹配形如 Node1 - Slope
与 Slope - Node2
的两边,注意 Slope
是可以共用的。
感觉能做啊。来整个 DFS 森林,易知叶子节点一定是 Slope
节点,而根也为 Slope
节点。
我们强制让深度小的连向深度大的,使其全部改造为有向边。则对于 Slope
点 \(u\):
让他所有连向儿子的边依次相邻匹配,如果一个不剩就回溯;如果剩一个就和父亲连向自己的边匹配。注意 Node
顶点不能重复匹配,所以匹配了的边的 Node
顶点要打上标记。
最后每棵树的根没父亲帮忙收尾,但可见这样每棵树最多只会损失一条边,也就是说我们的答案可以取 \(\sum\lfloor \frac {m} {2} \rfloor\),这一定是最大的!
「CF1567F」One-Four Overload
Thought.
如果有一个被标记的格子周围有奇数个未被标记的格子,无解。
如果一个被标记的格子周围没有未被标记的格子,则该格子填入 \(0\)。
所有周围有 \(2\) 个未被标记的格子的被标记的格子可以一起考虑,建图二分图染色即可。
那如果周围有 \(4\) 个未被标记的格子呢?考虑一种连边使得不存在奇环,这样就可以和上面一种情况融合起来解决。
对于周围有 \(4\) 个未被标记的格子 \((x, y)\),我们连接 \((x - 1, y) \to (x, y + 1), (x, y - 1) \to (x + 1, y)\)。感性理解一下所有的环都应该是绕被标记点一圈之类的,那肯定都是偶环。应该是吧?
事实证明,结论无误,但怎么证啊?(
Solution.
再次选择留个坑。
「CF1103C」Johnny Solving
Thought & Solution.
不要再做二选一子任务了要吐了。
直接 en 上 DFS 树,子任务一根据深度可解。按照套路,如果子任务一不可解则子任务二可解,并且可以据此来构造。
考虑这样一颗 DFS 树,所有的节点在原图中度大于等于 \(3\),也就说明对于任意结点一定有一条在树上可以成环的边。且这条边可以证明一定连接两个具有祖孙关系的点。
又因为任务一不可解,所以深度小于 \(\frac {n} {k}\)。只能发现每一层深度相同的点期望个数有 \(k\) 个,没有动机去构造这 \(k\) 个环啊。
!取所有的叶子节点(个数一定不小于 \(k\)),利用不在树上的边构环即可。
尝试证明细节。
首先每个叶子节点一定能构成三个及以上的环。两条返祖边分别加祖先到叶子的链,已经两个祖先之间的路径加两条返租边。
因为没有重边,不难发现一定存在一个长度大于 \(3\) 而不是 \(3\) 的倍数的环。