Submission #1184452

#TimeUsernameProblemLanguageResultExecution timeMemory
118445212345678Unique Cities (JOI19_ho_t5)C++20
100 / 100
421 ms32836 KiB
#include <bits/stdc++.h>

using namespace std;

const int nx=2e5+5;

int n, m, u, v, c[nx], lvl[nx], dn[nx], ans[nx], rt, f[nx], cnt;
vector<int> d[nx];
pair<int, int> mx;
stack<int> s;

void add(int u)
{
    s.push(u);
    if (f[c[u]]++==0) cnt++;
}

void rem()
{
    if (--f[c[s.top()]]==0) cnt--;
    s.pop();
}

void dfslvl(int u, int p)
{
    if (u==p) lvl[u]=0;
    else lvl[u]=lvl[p]+1;
    for (auto v:d[u]) if (v!=p) dfslvl(v, u);
}

void dfsdn(int u, int p)
{
    dn[u]=0;
    for (auto v:d[u]) if (v!=p) dfsdn(v, u), dn[u]=max(dn[u], dn[v]+1);
}

void solve(int u, int p)
{
    //cout<<"in "<<u<<' '<<cnt<<' '<<s.size()<<'\n';
    int smx=0;
    pair<int, int> hv={0, 0};
    for (auto v:d[u]) if (v!=p) hv=max(hv, {dn[v]+1, v});
    for (auto v:d[u]) if (v!=p&&v!=hv.second) smx=max(smx, dn[v]+1);
    //cout<<"hv "<<hv.first<<' '<<hv.second<<'\n';
    if (hv.second)
    {
        while (!s.empty()&&lvl[s.top()]>=lvl[u]-smx) rem();
        add(u);
        solve(hv.second, u);
        if (!s.empty()&&s.top()==u) rem();
        while (!s.empty()&&lvl[s.top()]>=lvl[u]-hv.first) rem();
        for (auto v:d[u])
        {
            if (v==p||v==hv.second) continue;
            add(u);
            solve(v, u);
            if (!s.empty()&&s.top()==u) rem();
        }
    }
    //cout<<"u "<<u<<' '<<s.size()<<'\n';
    //if (!s.empty()) cout<<"here "<<s.top()<<'\n';
    ans[u]=max(ans[u], cnt);
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n>>m;
    for (int i=1; i<n; i++) cin>>u>>v, d[u].push_back(v), d[v].push_back(u);
    for (int i=1; i<=n; i++) cin>>c[i];
    dfslvl(1, 1);
    for (int i=1; i<=n; i++) mx=max(mx, {lvl[i], i});
    rt=mx.second;
    mx={0, 0};
    dfslvl(rt, rt);
    dfsdn(rt, rt);
    solve(rt, rt);
    //cout<<"debug "<<cnt<<'\n';
    for (int i=1; i<=n; i++) mx=max(mx, {lvl[i], i});
    rt=mx.second;
    mx={0, 0};
    dfslvl(rt, rt);
    dfsdn(rt, rt);
    solve(rt, rt);
    for (int i=1; i<=n; i++) cout<<ans[i]<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...