今年应该只要985,我看a了0.3% 人家都进面了,211不配活着
4 4

相关推荐

03-08 16:59
已编辑
东北大学 Java
#淘天笔试# #淘天# #笔试# 考虑换根DP,先随便找个点做根,每个点只统计这个有根树下它的子树对它的贡献,也就是if(color[u] != color[v]) color[u] += color[v];这样我们只能统计出子树的贡献,我们还需要父亲的贡献,父亲的贡献我们考虑扩展并查集,在dfs过程中顺便合并一下就能够得到每个点所在并查集的size,如果一个点和它的父亲不同颜色,那么就是相同并查集,直接用并查集size减去dp求出的子树贡献就是父亲的贡献,然后第二遍dfs,把每个点任意一种颜色都试一下,我们提前知道子树的贡献是多少,可以根据现在我们变的颜色统计一下现在的子树和,看看父亲跟他现在是不是一个颜色,是的话不加贡献,不然加上贡献,和ans取最大值即可。代码如下:#include# include#include# include#include# include#include# include#include# include#include# include#includeusing ll = long long;using ull = unsigned long long;const int maxn = 1e6 + 5;int fa[maxn],sum[maxn],siz[maxn];std::string color;char col[] = {'R','G','B'};int ans  = 0;int find(int x){    return x == fa[x] ? x : find(fa[x]);}void merge(int x,int y){    x = find(x), y = find(y);    if(x == y) return;    siz[x] += siz[y];    fa[y] = x;}std::vector g[maxn];void dfs(int u,int fa){    sum[u] = 1;    for(int i = 0;i < g[u].size();i++){        int v = g[u][i];        if(v == fa) continue;        dfs(v,u);        if(color[u] == color[v]){            sum[u] += sum[v];            merge(u,v);        }    }}void dfs2(int u,int fa){    int sfa = (find(u) == find(fa)) ? siz[find(u)] - sum[u] : siz[find(fa)];    for(int i = 0;i < 3;i++){        char c = col[i];        int s = 1;        for(auto& v : g[u]){            if(v == fa) continue;            if(c != color[v]) s += sum[v];        }        if(c != color[fa]) s += sfa;        ans = std::max(ans,s);    }    for(auto& v: g[u]){        if(v == fa) continue;        dfs2(v,u);    }}void solve(){    int n;    std::cin >> n;    std::cin >> color;    for(int i = 1;i <= n;i++){        siz[i] = 1;        fa[i] = i;    }    for(int i = 0;i < n - 1;i++){        int u,v;        std::cin >> u >> v;        g[u].push_back(v);        g[v].push_back(u);    }    dfs(1,0);    dfs2(1,0);    std::cout << ans << '\n';}int main() {    int T;    T = 1;    while(T--) solve();    return 0;}
投递淘天集团等公司10个岗位 笔试
点赞 评论 收藏
分享
1. Http 的 post 和 get 方法的区别。2. 当 Linux 系统提示磁盘空间不足时,你会使用哪些命令来查看磁盘的使用情况?3. 库分片 sharding 的概念,它有什么优势和挑战?4. 什么是 Java 里的异常处理? checked 和 unchecked 异常有什么区别?5. Java 中的 static 和 final 分别有什么作用?6. 设计一个简单的文章热度计算系统,考虑浏览量、评论数和分享数等因素。7. 你是如何处理实时数据更新的?比如说当文章的浏览量、评论数或分享数发生变化时,系统是如何高效的更新热度值的呢?8. 你是如何提高自己的代码质量和编程技巧的?有哪些学习方法?请详细分享一下。9. 你通过测试重构设计模式、数据结构基础、开源社区学习技术文档和向同学请教来提高代码质量和编程技巧。在你提到的这些方法中,是否有一个具体的实际案例能详细描述一下你是如何通过这些方法来解决某个编程问题或提升某个项目的代码质量的?10. 结构优化电商管理系统的代码质量和查询效率。在这个过程中,你是如何判断和选择最合适的设计模式和数据结构的呢?能否分享一下你在做这些决策时的思考过程和依据11. 你会通过分析问题、拆分子问题和寻求外部帮助来解决不熟悉的技术领域问题。在这个过程中,当你面对一个拆分后的子问题,发现它比预期复杂,或者现有资源和信息不足以支持解决时,你会如何调整你的策略来继续推进问题的解决呢?12. 会在这个过程中,你提到可能会回溯到上一个问题来重新审视拆分的方向。我很好奇,当你决定回溯时,你是如何判断哪个节点是需要重新审视的关键点呢?你会用什么标准或方法来确定这个节点,而不是其他节点呢?13. 在面对一个你完全不熟悉的技术领域的问题时,你会采取哪些步骤来解决?请详细说明。#牛客AI配图神器#
点赞 评论 收藏
分享
正在热议
更多
牛客网
牛客企业服务