2025 #1 我依然怕先行者放弃了导航 奉献者悔恨起坚守过信条
T1. P4262 [Code+#3] 白金元首与莫斯科
\(n \times m\) 的棋盘上有一些障碍格,对于每一个非障碍格,需要求出若该格为障碍格,用 \(1 \times 2\) 的砖铺满棋盘的方案数。其中 \(1 \le n,m \le 17\)。
看到这一种比较抽象的网格上的题目,可以考虑使用插头 dp 来解决。
对于一个 \(1 \times 2\) 的方块,其实就是左插头连上右插头或者一个下插头拼一个上插头,那么可以考虑使用一个二进制来维护现在的轮廓线,然后暴力 Hash 维护即可。
对于求解每一格怎么样的问题,可以考虑正着反着各作一遍插头 dp,然后在把答案合并。
先考虑正着做,若当前非障碍格即没有左插头也没有上插头,就记录下对于当前格在当前轮廓线下的方案数总和。接着考虑倒着做,若当前格即没有右插头也没有下插头,就查一下正着做时的记录,然后把贡献扔进答案里。
T2. CF1491F
Lemma : 切换后一定走的是菊花图。
Proof : 为了删掉倒数第二条边,我们必须在最后一步走回头路。类似的,为了删掉倒数第四条边,我们必须在下一步走回头路。以此类推我们走到最后一定走的是一个菊花图。
这样子我们就可以枚举菊花中心点 \(u\)。接下来考虑如何构造答案。
删去 \(u\) 的若干条相邻的边后,要求只有 \(u\) 和另外一个点的度数为奇数或者所有点的度数并且除了孤点,图联通。
假如有和 \(u\) 不相邻的点的度数为奇数,则需要将所有与 \(u\) 相联的奇数度电之间的连边删除。然后就可以构造啦!
由于 \(n,m\) 比较小,可以直接暴力 \(\mathrm O(n(n + m))\) 做。
T3.CF1558E
强!
首先答案有单调性,这是显然的,所以考虑二分解决。接下来考虑如何判断一个 \(x\) 能否走遍整一张图。
不能立即走回头路这个限制很烦人,我们一定是要。考虑从点 \(u\) 开始,然后走到点 \(v\),然后希望从 \(v\) 开始不走回头路走到 \(u\),这样子的话这一步的决策就没有后效性了,接着我们就可以直接利用贪心扩展。考虑路径 \(u \to p_1 \to p_2 \to \cdots \cdots \to p_i \to u\),此时我们可以将这条路径上的所有点的贡献加上。
那么我们接下来就可以从原图上找到一个已经被扩展的点 \(u\),然后向没有被扩展的点 \(v\) 扩展一条带有简单环的路径,但是复杂度不行。
问题就出在了可能从 \(u\) 开始走某条路径到 \(v\) 之后走不通了,但是走另一条路到 \(v\) 就能继续走下去。所以我们每一次看到 \(v\) 还是得继续走,不能跳过。
假设我们目前有 \(2\) 条路径均 \(u \to p_i \to v\) 和 \(u \to p^{`}_i \to v\)。那么一定有 \(p_i \neq p^{`}_i\)。有因为 \(b\) 永远大于 \(0\),所以我们可以通过第一条路径过去,然后反着从第二条路径走回来,这样找到了一条具有简单环的路径,然后拓展即可。
一次拓展的复杂度为 \(\mathrm O(m)\),然后我们保证了每一个点都至多会被拓展一次,所以一次 check 的答案就是 \(\mathrm O(nm)\)。
那么最终的复杂度就是 \(\mathrm O(nm \log a_i)\)。
T4.CF1381D
好题!
我们发现只需要一个三叉树就可以将一个路径反过来。当这个三叉树的三叉长度均 \(\ge l\),并且当前这条路径可以到达他,那么这一条路径就可以反过来。
假设掉头中心为 \(u\),需要不断调整 \(s\) 和 \(t\),使得 \(u\),\(s\) 和 \(t\) 三点共线。实际上就是 \(s\) 所可以到达的右端点和 \(t\) 可以到达的左端点不断靠近。所以每一棵子树只需要处理出最深深度,然后用双指针即可。
应为你只需要到达一个掉头中心,你就可以取到其余所有的,所以你只需要找到一个即可。如果找不到那就是无解。
T5.北京大学 2024 年《数据结构与算法A(实验班)》期末考试E
令一个点的左节点和右节点的权值分别为 \(l_i,r_i\),那么我们钦定 \(l_i \le r_i\)。那么假如 \(\forall i,l_{p_i} \ge r_{p_{i - 1}}\) 那么该树一定可以被生成。
发现哈夫曼树有一个性质就是,就是哈夫曼树会使得 \(\sum^n_{i = 1} 2^{dep_i} \times a_i\) 最小的树,而这个值一定不会大于 \(2\times n \sum^n_{i = 1} a_i\)。所以点的深度会是在 \(O(\log n + \log a_i)\) 这个级别,然而在这个级别直接暴力枚举的复杂度我们是可以接受的。
回来看我们遇到了什么问题。很明显修改一个点的点权会使得其到根路径上所有点的点权改变,由于层数不多,所以我们直接暴力维护每一个点就行了。

浙公网安备 33010602011771号