寻找牛妹

最优题解

容易发现这是一棵树,1为根。那么走到牛妹所在的x的最大花费相当于x的子树中的通道都不走,x到根节点的通道只走一次,其他通道全走两次。用sz[x]表示x子树中通道数量,dep[x]表示根到x的通道数量,那么对于特定的x,答案就是2n-2-2sz[x]-dep[x]
时间复杂度和空间复杂度都是

vector<int> g[200055];
int sz[200055], dep[200055];
void dfs(int u, int f){
    sz[u] = 0; dep[u] = dep[f] + 1;
    for(int v: g[u]) if(v!=f) dfs(v, u), sz[u] += sz[v]+1;
    return;
}
vector<int> solve(int n, int m, vector<int> &u, vector<int>&v, vector<int> &x){
    for(int i = 0; i <= n; ++i)
        g[i].clear(), dep[i] = sz[i] = 0;
    assert(u.size() == n-1 && v.size() == n-1 && x.size() == m );
    for(int i = 0; i < n-1; ++i){
        g[u[i]].push_back(v[i]);
        g[v[i]].push_back(u[i]);
    }
    dep[0] = -1;
    dfs(1, 0);
    vector<int>ans;ans.clear();
    for(int i = 0; i < m; ++i){
        ans.push_back(2*n-2-2*sz[x[i]]-dep[x[i]]);
    }return ans;
}
全部评论

相关推荐

头像 会员标识
10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
在努力的外卷侠很靠谱:怎么,大家都没保底吗?我这美团已经入职了,不说了,系统派单了。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务