讲一个 $O(n^2)$ 的做法。
考虑使用直径中点的移动来刻画删点的过程。
我们先来做一些基本的分析:
当直径长度为偶数时,中点在原树的一条边上,此时有两个分支。每个分支中距离中点为 $\frac L 2$ 的点都可以作为直径的端点。
把其中一个分支中的直径端点删光之后,中点会向相反的分支移动 $\frac 1 2$。
奇数时也差不多,不过此时需要删掉除了一个分支外的其他分支中点的位置才会改变。
方便起见,我们把移动的过程放到边上去处理。并把每条无向边拆为两条有向边用以刻画移动的方向。
考虑 dp ,设 $f_{i,j,k}$ 表示当前直径的长度为 $i$ 当前在编号为 $j$ 的边上,钦定边 $j$ 向着的子树中有 $k$ 个点是要删掉的。
状态数是 $O(n^2)$ 的,考虑对于一个 $j,i$ 来讲,$k$ 的数量应当是以 $j$ 为根的树在深度为 $i$ 这一层点的数量。
考虑怎么转移,我们只讨论偶数的情况。
设两边点分别为 $c_1,c_2$,我们枚举一个 $x$ 表示剩下来的分支中钦定要删的点的数量,那么我们有 $f_{i,j,k}\times coef\to f_{i-1,j',x}$。
其中 $coef$ 是转移的系数,它有两部分组成。
一部分是对于完全删掉的分支有一个删点顺序的方案。
另一部分是有形如 $a,b$ 个无区别的白黑点,每次删一个,问 $a$ 先被删完的方案数,这是一个组合数。
注意到这里我们不会考虑留下来的分支所带来的编号分配的问题。
也就是一个延后计算贡献的思想,我们只会在一个分支被全部删掉的时候才会考虑编号的问题(可能也不完全是编号,反正就是大概这个意思)。
分析一下复杂度发现是 $O(c_1c_2+c_1^2)$ 的,无法通过。
但是注意到 $\sum c_1c_2$ 是 $O(n^2)$ 的(和树形背包同样复杂度的东西),所以考虑编一个这个复杂度的做法。
发现上面枚举 $x$ 的过程十分地冗余,我们不考虑用刷表法来做这个 dp。
考虑一个 $(i-1,j',x)$ 此时与 $coef$ 有关的东西,其中第一部分是确定的,第二部分的组合数我们考虑设一个数组 $g$ 。
用类似 agc001e 的方式把组合数看成在网格上游走的方案数求一遍即可,
在本题中的意义即是 $g_{c_1,c_2}$ 表示有 $c_1$ 个白点,$c_2$ 个黑点,每次删一个,黑点先删完的所有方案对应的 $f$ 值乘上组合数之和。
对于直径为奇数也是同理,只不过需要多记一维 $0/1$ ,表示最后一个删的是黑点还是白点。
笔者语文不太好,建议配合代码食用/kel。