扩散

最优题解

存下每个点可以直接到达的点,形成一棵树。如果我们简单的每次发生提升的直接遍历这个点可以到达的点,那么当每次找的点的度数都很大的时候,会超时。(比如节点1有20000个儿子,节点1发生了100000次提升)
但是我们可以先存下每个节点提升的次数,最后再整个遍历一遍来求出答案。这样每个点只会被父亲访问一次,时间复杂度。因为需要存下每个点可以到达的点,以及预存次数,空间复杂度

vector<int> g[200005];
int a[200005], d[200005];
void dfs(int u, int fa){
    d[u] += a[u]; d[fa] += a[u];
    for(int v: g[u]){
        if(v == fa) continue;
        d[v] += a[u];
        dfs(v, u);
    }
    return;
}
vector<int> solve(int n, int m, vector<int> &u, vector<int>&v, vector<int> &q){
    for(int i = 0; i <= n; ++i) g[i].clear(), a[i] = d[i] = 0;
    assert(u.size() == n-1 && v.size() == n-1 && q.size() == m);
    for(int i = 0; i < n-1; ++i){
        g[u[i]].push_back(v[i]); g[v[i]].push_back(u[i]);
    }
    for(int i = 0; i < m; ++i){
        a[q[i]] ++;
    }
    dfs(1, 0);
    vector<int> ans; ans.clear();
    for(int i = 1; i <= n; ++i) ans.push_back(d[i]); return ans;
}
全部评论

相关推荐

11-04 19:05
已编辑
东莞城市学院 单片机
不知道怎么取名字_:你这个要实习两年?哪有这么久的,感觉就是即使你毕业了,但还按实习的话,是不是不用给你缴社保公积金啥的
点赞 评论 收藏
分享
dachang盒子:26届秋招必须有实习经历,建议找个实习过度下,同时项目重复率也比较高没有什么难点亮点,我这里有大厂真实的项目可以提供给你学习也可以给你包装大厂实习来提高你的竞争力,感兴趣的话可以私信我或者点我主页简介
你已经投递多少份简历了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务