2 条题解

  • 5
    @ 2026-9-15 16:57:51

    对于每个点,求一个 sizsiz 指子树大小。

    对于一条边 (u,v,w)(u,v,w),u,v,wu,v,w 分别指边链接得两个点,和这条边的脆弱值,其中的 uu 为 vv 的父亲。

    这条边把树分成两部分,一边有 sizvsiz_v 个节点,另一边就有 n−sizvn-siz_v 个节点,损伤值 = ∣sizv−(n−siz)∣×c|siz_v - (n-siz)| \times c。

    时间复杂度 O(n)O(n),空间 O(n)O(n)。

    参考代码(仅有关键部分):

    void dfs(int u,int fa){
        siz[u]=1;
        for(auto son:g[u]){
            int v=son.v;
            if(v==fa) continue;
            dfs(v,u);
            siz[u]+=siz[v];
        }
    }
    
    void get(int u,int fa){
        for(auto son:g[u]){
            int v=son.v;
            ll w=son.w;
            if(v==fa) continue;
            ans+=w*abs(siz[v]-(n-siz[v]));
            get(v,u);
        }
    }
    

    信息

    ID
    2739
    时间
    2000ms
    内存
    256MiB
    难度
    4
    标签
    (无)
    递交数
    27
    已通过
    12
    上传者