牛客练习赛47 DongDong数颜色 树上启发式合并

题目链接:https://ac.nowcoder.com/acm/contest/904/E
题目大意:
图片说明
思路:裸的树上轻重链启发式合并

#include <bits/stdc++.h>
#define LL long long
using namespace std;

int a[100005];//dfs序的颜色
int b[100005];//i节点的颜色
int c[100005];//颜色桶
int dfn[100005];//dfs序
int s[100005];//子树节点个数
int son[100005];//重链节点
int ans[100005];
int now=0, T=0;
vector<int> G[100005];

void dfs(int u, int fa){//得到dfs序,和重链的节点
    s[u]=1; dfn[u]=++T;
    for(auto x: G[u]){
        if(x!=fa){
            dfs(x, u); s[u]+=s[x];
            son[u]=s[x]>s[son[u]]?x:son[u];
        }
    }
}

void add(int u){//计算贡献
    now+=!c[u]++;
}

void DFS(int u, int fa, int k){//当前节点, 父亲节点, 是否保留c数组
    for(auto x: G[u]){//把除了重链的所有的子树的答案计算出来
        if(x!=fa&&x!=son[u]){
            DFS(x, u, 0);
        }
    }
    //计算u这棵树的答案
    if(son[u]) DFS(son[u], u, 1);//先计算重链
    for(auto x: G[u]){//轻链上的贡献
        if(x!=fa&&x!=son[u]){
            for(int i=0; i<s[x]; i++){
                add(a[dfn[x]+i]);//子树的dfs序是连续的
            }
        }
    }
    add(a[dfn[u]]); ans[u]=now;//把u自己加进去

    if(!k){//是否需要清空
        for(int i=now=0; i<s[u]; i++){
            c[a[dfn[u]+i]]=0;
        }
    }
}

int main(){
    int n, m, x, y, q; scanf("%d%d", &n, &m);
    for(int i=1; i<=n; i++){
        scanf("%d", &b[i]);
    }
    for(int i=1; i<n; i++){
        scanf("%d%d", &x, &y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
    dfs(1, 0);
    for(int i=1; i<=n; i++){
        a[dfn[i]]=b[i];
    }
    DFS(1, 0, 1);
    while(m--){
        scanf("%d", &q);
        printf("%d\n", ans[q]);
    }

    return 0;
}
全部评论

相关推荐

03-04 15:02
已编辑
南京大学 Java
3.3&nbsp;一面岗位:&nbsp;后台开发部门:&nbsp;腾讯云场景题偏多,没问项目,没手撕,时长半小时1.&nbsp;自我介绍2.&nbsp;Java基础:-&nbsp;Treemap&nbsp;&amp;&nbsp;HashMap区别-&nbsp;ArrayList,&nbsp;添加n个数(n较大),会发生什么(应该是想问ArrayList的扩容机制)-&nbsp;考虑扩容的情况下这个过程的复杂度多少(说明复杂度计算思路即可,不需要给出具体的复杂度)3.&nbsp;并发:-&nbsp;项目里怎么用多线程的(一开始答了具体场景,不过面试官想听的是线程池,Synchronized这些...)-&nbsp;volatile&nbsp;&amp;&nbsp;synchronized-&nbsp;这里还问了一个,不过忘了...-&nbsp;假设项目里用了很多synchronized拖慢了系统效率,让你重构项目,你怎么设计?&nbsp;(真不会,回了一个参考乐观锁的设计用版本号之类的,然后这个话题就过了)4.&nbsp;JVM-&nbsp;JVM垃圾回收,怎么判断对象有没有被引用?&nbsp;(可达性分析)-&nbsp;GC&nbsp;Root有哪些-&nbsp;遇到OOM怎么排查5.&nbsp;场景-&nbsp;设计一个数据结构,用于在搜索框中搜索人名(不知道是不是这个意思,答了字典树这个结构)-&nbsp;使用字典树存储的话空间复杂度是多少(同前面,给出计算思路就行,不需要具体的值)-&nbsp;问了下简历上项目的背景,项目的具体内容没问-&nbsp;项目里的难点/印象深刻的点,咋解决的-&nbsp;针对上一点提了一个发散性的场景题(让你设计个xxx,你的思路)然后反问,无手撕。---春招第一面,被场景设计问题拷打麻了,就当练习了,不敢奢望能过,后续随缘了3.4更新,已挂
_追梦旅人_:大家考虑深圳睿联不,我们正在春招,可在我主页看岗位,感兴趣可直接投递~
查看15道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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