Cry_For_theMoon  

其实目前只有模拟的两道题,因为都没有原题的缘故,所以就单独开了一节,类型可能是相近的。

1. 红

大小为 \(n\) 的树上有等量的黑白点(保证 \(n\) 为偶数)。试求最小权完美匹配,权值定义为树上距离。

\(n\le 10^5\)

考虑自底向上地贪心:我们证明一定会在 lca 处贪心地尽可能多地合并:若当前存在两个点可以合并,但不在 lca 处合并,设为 \((x,y)\),那么他们一定在当前子树 \(u\) 以外的点找到匹配,设 \(x\)\(z\) 匹配,\(y\)\(w\) 匹配,我们将发现,交换成 \(x\)\(y\) 匹配,\(z\)\(w\) 匹配一定更为优秀,证毕。

时间复杂度 \(O(n)\)

2. 散乱

\(n\) 个点的树,每个点都有一个宝藏。需要在若干个点安放若干个矿工来收集所有宝藏。一个矿工可以收集不超过 \(s\) 个宝藏,且收集的宝藏距离其所在位置不超过 \(k\)。问至少需要多少个矿工。

\(n\le 10^5,k\le 20\)

首先这题有一个 \(k=1\) 的部分分:考虑从下往上贪心,显然我们考虑叶子,我们一定会在叶子的父亲放矿工,而不是在叶子本身。

思考一下好像 \(k\le 20\) 的话也可以做贪心:其实所谓自下而上的贪心就是 dfs 一遍。

首先我们要记录两个东西:\(f(u,k)\)\(g(u,k)\),第一个是代表当前 \(u\) 的子树里,深度为 \(k\) 的,还有多少个点的宝藏没被发掘;\(g(u,k)\) 则是代表 \(u\) 的子树里,深度为 \(k\) 的位置的所有矿工还能额外收集多少个宝藏。

考虑合并:我们是否依旧能证明在 lca 处贪心合并是正确的?不幸的是,这次是错误的:我们仍沿用交换法,我们很快就发现,我们并不能保证,\(x-z,y-w\) 合法 $\Rightarrow $ \(x-y,z-w\) 合法。

所以我们的贪心策略应该是能把这些点往上搁置,就往上搁置,除非他们的距离已经是 \(k\)\(k-1\),此时你就能得到:\(x-z,y-w\) 合法 $\Rightarrow $ \(x-y,z-w\) 合法。

而且我们应当先处理所有距离为 \(k\) 的匹配,因为对于一个点 \(u\) 来说,若 \(v_1\) 和它距离为 \(k\)\(v_2\) 和它距离为 \(k-1\),显然 \(v_1\) 深度更深,也就会更先失效,所以应该尽早抢救。

最后,如果 \(f(u,K)\) 不为 \(0\),这些点无法往上拖了,所以必须在 \(u\) 点新增 \(\lceil \frac{f(u,K)}{s} \rceil\) 个矿工,把多余的累加进 \(g(u,0)\)

最后到根节点处,我们发现不能再往上拖延了,此时我们依旧按照降序的顺序,先处理距离为 \(k\) 的匹配,再处理距离为 \(k-1\) 的匹配,...,最后处理距离为 \(0\) 的匹配。

如果这样,还多出一些宝藏没有被发掘,设为 \(cnt\) 个,则答案最后再加上 \(\lceil \frac{cnt}{s} \rceil\) 即可。

时间复杂度 \(O(nk)\)

记录

posted on 2022-10-20 13:47  Cry_For_theMoon  阅读(154)  评论(1编辑  收藏  举报