【题解】CF1010F Tree

注意到可以题目相当于给每个节点 \(u\) 一个权值 \(b_u\geq 0\),此时令 \(a_u\) 为以 \(u\) 为根的树的子树 \(b\) 权值和,就得到了一个合法方案方案,不难发现每个 \(a\) 权值的合法方案反过来也能得到唯一一个 \(b\) 权值的合法方案,现在的问题变成了对合法的 \(b\) 权值方案计数。

假设剩余连通块一共有 \(t\) 个节点,不难发现方案数为 \({a+t-1\choose t-1}\)

接着考虑令 \([x^s]g_u(x)\) 表示 \(u\) 子树中选了 \(s\) 个节点的方案数(且形成以 \(u\) 为根的连通块)。

注意到 \(g_u(x)=1+xg_{v_1}(x)g_{v_2}(x)\),很明显 \(g_u(x)\) 的次数是子树大小级别的,直接 ntt 处理转移式复杂度不正确。

效仿长链剖分优化 dp,不妨考虑重链剖分优化 dp 。即处理 \(g_u(x)\) 转移式的时候继承重儿子,合并轻儿子。现在的问题在于怎么继承重儿子。

考虑某条重链,整理 \(g_u(x)\) 的转移式,不难发现:令重链上从上到下第 \(i\) 个点的非重儿子为 \(v_i\),令链顶为 \(u\),那么最终 \(g_u(x)\) 可以被表示成:\(1+xg_{v_1}(x)+x^2g_{v_1}(x)g_{v_2}(x)+\cdots\),也就是 \(\sum\limits_{i=0}^{len}x^i\prod\limits_{j=1}^{i}g_{v_j}(x)\),当然需要注意链底的细节。

分治解决最后一部分即可,最后的复杂度是 \(O(n\log n\times \log^2 n)=O(n\log^3 n)\) 的,当然还带了很大的常数(比如说 \(g_u(x)\) 转移式那里的 \(x^{1,2,\cdots, len}\))。

这样的做法很好扩展到非二叉树:将 \(g_{v_j}(x)\) 替换为轻儿子的 \(g(x)\) 之积即可。但是这题最主要的思想还是用重链剖分优化多项式次数为子树大小级别的树上背包

代码:Submission #127208036 - Codeforces

【题解】CF1010F Tree

上一篇:quartz的学习与使用


下一篇:Gin获取请求参数