O(n) 空间树形背包
把 \(v\) 合并到 \(u\) 上之后,直接把 \(v\) 的状态删了,这样就 \(O(n)\) 了,,,
形如:
for (int T = h[u], v; T; T = e[T].t)
if ((v = e[T].v) != k)
{
D(v, u);
for (int i = 0; i <= s[u]; ++i)
for (int j = 0; j <= s[v]; ++j)
{
// 合并 f[u], f[v] 得到 g
}
f[v].clear(), f[v].shrink_to_fit();
s[u] += s[v], f[u].resize(s[u] + 1);
for (int i = 0; i <= s[u]; ++i)
f[u][i] = g[i], g[i] = 0;
}
upd:凑够 50 踩我也不写树上邻域数点。

浙公网安备 33010602011771号