留空DP——[NOI2023] 桂花树 题解
留空DP——[NOI2023] 桂花树 题解
快进:
-
题目等价于是把 \(m\) 个有标号点插入进 \(n\) 个节点的树上。
一个 \(n\) 个节点的树:

-
考虑 \(m=1\) 的过程,发现是把一个点插在边上,或挂在点下,那么 \(ans=2n-1\)
挂在点下:

插在边上:

-
然后发现从小到大用上述过程插入 \(m\) 个点,可以构造出 \(k=0\) 的所有情况。所以得到 \(k=0\) 的答案 \(ans=(2n-1)(2n+1)\cdots (2n+2m-3)\)。
-
然后发现 \(k>0\) 的时候其实相当于多了如下方案:在一条边上插入了一条边(第2步是在一条边上插入一个点),设浅的编号为 \(x\) ,深的编号为 \(y\),满足 \(0<x-y\le k\)。

-
因为 \(k\) 很小,所以可能状压,但边的情况太多了,直接枚举边插入容易算重(比如先插入边 \(x\to z\) 再在中间插入 \(y\),与先插入边 \(x\to y\) 再插入 \(z\) 作为 \(y\) 的叶子是一样的)。
快进结束。
为了结合第2步的插入过程,我们还是从小到大枚举,当进行”插入一条边“操作时,仅把
深的节点 \(y\) 确定为当前节点 \(i\) 了,而把浅的节点 \(x\) 留空,成为一个待决点,待后来插入时决定。很明显 \(x\in [i+1,i+k]\),那么只需要状压 \(k\) 个空即可。

那么每个节点插入时有三种情况:设当前树上有 \(size\) 个节点
-
将 \(i+1\) 插在边上或挂在点下,系数 \(2size−1\)。
-
将 \(i+1\) 插入一条边,包含一个待决点,系数 \(size−1\)。
-
用 \(i+1\) 填上一个空白点。
转移即可,复杂度 \(\mathcal O(mk2^k)\)。

浙公网安备 33010602011771号