「奶龙」题解
T660627 「奶龙」新闻
有一个显而易见的分层结构,设树上深度 \(\le x\) 的节点数 \(s_x=i\),则有:
然后显然一个区间是否合法只和它自己有关,所以有一个显而易见的 DP:跑出来所有有效的区间,有 \([i,j]\) 到 \([j+1,k]\) 的转移系数是 \(\binom{n-j}{k-j}(j-i+1)^{k-j}\)。暴力枚举 \(i,j,k\) 就有一个根据实现是否精细决定的 \(O(n^3)\) 或者 \(O(n^3 \log n)\) 的做法,至此有 30pts。
然后我们发现 \(k\) 给的很小,所以考虑分析一下有效区间的状态。事实上大概会形如下面的图片。

所以合法的转移显然只有 \(O(nk+(n \bmod k)^3)\),同样根据实现是否精细有可能带一个 \(\log\)。注意到 \(n \bmod k\) 被我卡满到 \(O(k)\) 了,所以随便写一下有 60pts。
容易发现转移 \(O(k^3)\) 的部分完全来自于绿色部分。所以只要不在 \(k \lfloor \dfrac{n}{k} \rfloor \sim n\) 的区间里反复转移就能做到 \(O(nk)\)。注意到这部分节点可以随便挂,所以只要能求出来下面问题的答案即可:
有 \(m\) 个根,有 \(n\) 给节点往这 \(m\) 个根下面挂,所形成的森林数量。我们使用一些总所周知的技巧(打表)得到答案为 \(m(n+m)^{n-1}\)。
这样绿色部分的答案就可以 \(O(\log n)\) 计算,前面的转移这样复杂度就来到了 \(O(nk \log n)\),应该有 70pts。
显然这个 \(\log n\) 可以去掉,因为每次幂次都只改变 \(1\),维护一下值时候乘上一个底数就好了,复杂度来到 \(O(nk)\),应该有 80pts。
我们发现当 \(k \ge \sqrt n\) 时,
浙公网安备 33010602011771号