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 踩我也不写树上邻域数点。

posted @ 2024-06-22 14:56  Jijidawang  阅读(217)  评论(13)    收藏  举报