Dsu on tree板子

题目链接:https://codeforces.com/contest/600/problem/E

int c[maxn];
int dfn[maxn];
int siz[maxn];
int rk[maxn];
int son[maxn];
int l[maxn];int r[maxn];
int a[maxn];
int cnt;
int root;
int mx;int sum;
int ans[maxn];
void add(int u){
    a[c[u]]++;
    if(a[c[u]]>mx){
        mx=a[c[u]];sum=c[u];
    }else if(a[c[u]]==mx){
        sum+=c[u];
    }
}
void del(int u){
    a[c[u]]--;
}
vector<int>e[maxn];
void dfs(int u,int fa){
    dfn[u]=++cnt;
    l[u]=cnt;
    rk[cnt]=u;
    siz[u]=1;
    son[u]=-1;
    for(int v:e[u]){
        if(v==fa)continue;
        dfs(v,u);
        siz[u]+=siz[v];
        if(son[u]==-1||siz[v]>siz[son[u]])son[u]=v;
    }
    r[u]=cnt;
}

void dfs2(int u,int fa,int ok){
    for(int v:e[u]){
        if(v==fa||v==son[u])continue;
        dfs2(v,u,0);
    }

    if(son[u]!=-1)dfs2(son[u],u,1);

    for(int v:e[u]){
        if(v==fa||v==son[u])continue;
        for(int w=l[v];w<=r[v];w++){
            add(rk[w]);
        }
    }
    add(u);
    ans[u]=sum;
    if(!ok){
        for(int w=l[u];w<=r[u];w++){
            del(rk[w]);
        }
        mx=sum=0;
    }

}
void solve(){
    int n;cin>>n;
    root=1;
    rep(i,1,n)cin>>c[i];
    rep(i,1,n-1){
        int u,v;cin>>u>>v;
        e[u].pb(v);e[v].pb(u);
    }
    dfs(root,0);
    dfs2(root,0,0);
    rep(i,1,n){
        cout<<ans[i]<<' ';
    }
}
posted @ 2025-05-23 18:17  Marinaco  阅读(26)  评论(0)    收藏  举报
//雪花飘落效果