P5912 JAS 题解
题意;找出最浅的点分树。
发现这是一个等价问题:给每个结点一个标号,当两个结点标号相同时,它们的路径上必有严格更小的标号。如果找到了这样一种标号方法,每个结点的标号就是它的深度。
同时我们还可以把每个结点的标号 \(x\) 对应到 \(n+1-x\),也是一一对应。问题又变成路径上必有严格更大的标号。
给出一个贪心构造标号的方法:先让所有叶子为 \(1\),然后对于非叶子结点,它的标号为不与它的子树冲突的最小数。
那我们如何判断一个结点 \(u\) 能填哪些数?
定义一个结点 \(x\) 对于 \(u\) 是 “溢出的”:如果 \(x\) 到 (\(x\) 所在的 \(u\) 的子树的根)的路径上所有点权都 \(<x\),称结点 \(x\) 是溢出的。
子树的溢出的结点构成子树的溢出集合。
显然 \(u\) 不能取每个子树溢出集合中的任何一个数。同时如果两颗子树中有两个溢出的结点权值相等为 \(y\),则 \(u\) 的权值必须 \(>y\)。
然后是这个贪心的证明。
记 \(f(s_1\sim s_k)\) 为当儿子们的溢出集合为 \(s_1\sim s_k\) 时,\(u\) 能填的最小数。\(F(s_1\sim s_k)\) 为用 \(f(s_1\sim s_k)\) 填了 \(u\) 后,\(u\) 子树的溢出集合。
两个引理:
-
当 \(u\) 填 \(f(s_1\sim s_k)\) 时,\(u\) 子树的溢出集合最小。这里的最小是指如果把集合看作二进制数时最小。后面的集合比大小也是这么定义。
-
当 \(s_k'\ge s_k\),\(F(s_1\sim s_{k-1}, s_k')\ge F(s_1\sim s_{k-1},s_k)\)。
若这两条引理成立,贪心就能简单证出来:
根据 2,要 \(u\) 的溢出集合最小,要使所有儿子的溢出集合最小。
而根据 1,填 \(f()\) 能使溢出集合最小。则贪心得证。
引理 1 证明:
观察到 \(u\) 填入 \(x\) 后,\(u\) 的溢出集合就是把儿子的溢出集合并起来,然后删去所有小于 \(x\) 的数。
记 \(T=s_1\cup \dots\cup s_k\)。如果把集合视作二进制数,\(u\) 填入 \(x\) 就相当于在 \(x\) 位上变成 \(1\),比 \(x\) 位低的都改成 \(0\)。这样显然是 \(x\) 尽量小才好。
引理 2 证明:
记 \(t\) 为 \(s_1\sim s_{k-1}\) 中最大的出现在至少两个集合中的数(\(t=0\) 表示无公共元素),\(T=s_1\cup\dots\cup s_{k-1}\) 再去掉 \(\le t\) 的数。
发现若 \(t>0\),则 \(s_k\) 中 \(\le t\) 的元素都无意义,所以所有集合都可以去掉后 \(t\) 位。也就是可以假设 \(t=0\),即没有公共元素。那此时的 \(T=s_1\cup\dots\cup s_{k-1}\),因为没有 \(\le t\) 的数了。
再简化一下命题,因为引理 2 其实表示了一个单调性质,于是我们可以假设 \(s_k'=s_k+1\)。
设 \(w\) 为最小的不属于 \(s_k\) 的标号。
-
情况一,\(s_k\cap T\) 有元素大于 \(w\)。
因为有交集大于 \(w\),所以 \(f()\) 一定大于 \(w\)。而 \(F()\) 为填了 \(f()\) 的溢出集合,因为 \(f()>w\),比 \(f()\) 低的位都会变成 \(0\)(不再溢出)。
但 \(s_k,s_k'=s_k+1\) 的区别就是:\(s_k\) 的最低位一直到 \(w\) 的前一位都是 \(1\),第 \(w\) 位是 \(0\);\(s_k+1\) 的最低位一直到 \(w\) 的前一位都是 \(0\),第 \(w\) 位都是 \(1\)。其他的都一样。
但是 \(f()\) 把较低位的都变成 \(0\) 了,所以 \(s_k,s_k'=s_k+1\) 最终算出来的 \(F\) 相等。
-
情况二,不满足情况一且 \(w\in T\)。
因为 \(f()\) 选择的位不能出现在任何儿子的溢出集合,所以 \(f()\) 选择的位一定在所有儿子的溢出集合中都是 \(0\),也就等价于 \(T\) 的位上和 \(s_k(s_k')\) 的位上都是 \(0\)。(\(t=0=>T=s_1\cup\dots\cup s_{k-1}\))
因为 \(w\in T\),所以 \(T\) 的第 \(w\) 位为 \(1\)。
考虑 \(f(s_1\sim s_{k-1},s_k)=f(T,s_k)\),因为 \(s_k\) 第 \(w\) 位以下都是 \(1\),第 \(w\) 位为 \(0\),所以 \(f(T,s_k)\) 不能在 \(w\) 及以下。(第 \(w\) 位及以下都有非 \(0\) 的)因此 \(f(T,s_k)\) 是在第 \(w\) 位以上找到的第一个 \(T,s_k\) 都是 \(0\) 的位。
又 \(T,s_k+1\) 的第 \(w\) 位都是 \(1\),重复了,所以 \(f(T,s_k+1)\) 必须高于第 \(w\) 位。所以 \(f(T,s_k+1)\) 是在第 \(w\) 位以上找到的第一个 \(T,s_k+1\) 都是 \(0\) 的位。
因为第 \(w\) 位以上 \(s_k,s_k+1\) 相同。所以这种情况下 \(f(T,s_k)=f(T,s_k+1)\)。
-
情况三,不满足情况一且 \(w\not\in T\)。
则 \(T\) 的第 \(w\) 位为 \(0\)。
因为 \(s_k,T\) 的第 \(w\) 位都是 \(0\),所以 \(f(T,s_k)\) 就是第 \(w\) 位,\(F(T,s_k)\) 的第 \(w\) 位以上为 \(T\cup s_k\),第 \(w\) 位为 \(1\),第 \(w\) 位以下为 \(0\)。
即 \(F(T,s_k)=(T\cup s_k)+1\)。
因为 \(s_k+1\) 的第 \(w\) 位为 \(1\),\(s_k+1\) 比第 \(w\) 位更高的位与 \(s_k\) 相等。所以 \(F(T,s_k+1)\) 至少第 \(w\) 位是 \(1\),比 \(w\) 高的位和 \(T\cup s_k\) 相同。而比 \(w\) 低的位 \(F(T,s_k)\) 全是 \(0\),所以 \(F(T,s_k+1)\ge F(T,s_k)\)。
综上,引理 2 也得证了。
所以贪心方法是:每个叶节点都标号 \(1\),其他结点的权值为 \(f(sons)\)。标号结束后最大的标号就是答案。
计算溢出集合、找出最低的都是 \(0\) 的位可以在 \(O(\log n)\) 的时间里做完。(位运算应该能到 \(O(1)\))