提供一个 C 题的做法。
考虑怎么把答案最大化。对于当前点 \(u\) ,我们可以选择一个子树进行处理,然后再选择 \(u\) 点本身,最后还可以再选一个子树处理。
我们对于每个点维护一个 multiset 表示当前节点进行处理可以增加序列的长度。每次搜索到一个点 \(u\),我们把它所有子节点的 multiset 合并,取出最大的两个值 \(x,y\),放入 \(x+y+1\)。
启发式合并即可维护。