Submission #1236337

#TimeUsernameProblemLanguageResultExecution timeMemory
1236337hamanp87Unique Cities (JOI19_ho_t5)C++17
100 / 100
201 ms35356 KiB
#include<bits/stdc++.h>
using namespace std;

//#pragma GCC optimize("03,unroll-loops")
//#pragma GCC target("avx2")
//#pragma GCC target("sse4")

#define all(v) v.begin(),v.end()
#define F first
#define S second
#define pub push_back
#define pob pop_back
#define puf push_front
#define pof pop_front
//#define randi uniform_int_distribution<long long>
#define damoon(v) v.resize(unique(all(v))-v.begin())
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//randi dist(0,10000000000000000);

typedef pair<int,int> pii;
typedef pair<long long,long long> pll;
typedef pair<int,bool> pib;
typedef pair<long long,bool> plb;
typedef pair<int,pii> pip;
typedef pair<pii,int> ppi;
typedef vector<int> veci;
typedef vector<long long> vecl;
typedef vector<bool> vecb;
typedef vector<pii> vecp;
typedef set<int> seti;
typedef set<long long> setl;
typedef set<pii> setp;
typedef map<int,int> mapii;
typedef map<long long,long long> mapll;
typedef map<int,bool> mapib;
typedef map<long long,bool> maplb;

const int inf=1e9,mod=1e9+7,neginf=-1e9,N=1e6;
const double PI=acos(-1);
int dnt;
veci col,ans,cnt,st,crd,crh;
vector<veci> adj;

void dfs1(int u,int par)
{
    crd[u]=(par==0)?0:crd[par]+1;
    crh[u]=1;
    for(int v:adj[u])
    {
        if(v==par)
            continue;
        dfs1(v,u);
        crh[u]=max(crh[u],crh[v]+1);
    }
}

void POP()
{
    int u=st.back();
    int c=col[u];
    cnt[c]--;
    if(cnt[c]==0)
        dnt--;
    st.pob();
}

void PUSH(int u)
{
    st.pub(u);
    int c=col[u];
    if(cnt[c]==0)
        dnt++;
    cnt[c]++;
}

bool cmp(int a,int b)
{
    return crh[a]>crh[b];
}

void dfs2(int u,int par)
{
    if(par!=0 and adj[u].size()==1)
    {
        ans[u]=max(ans[u],dnt);
        return;
    }

    sort(all(adj[u]),cmp);

    while(adj[u].size()>2 and st.size() and (crd[u]-crd[st.back()]<=crh[adj[u][2]]))
        POP();

    PUSH(u);

    int ind=par!=0?1:0;

    dfs2(adj[u][ind],u);

    while(st.size() and (crd[u]-crd[st.back()]<=crh[adj[u][ind]]))
        POP();

    ans[u]=max(ans[u],dnt);

    for(int i=ind+1;i<adj[u].size();i++)
    {
        while(st.size() and crd[st.back()]>=crd[u])
            POP();
        PUSH(u);
        dfs2(adj[u][i],u);
    }
}

void solve()
{
    int n,m;
    cin>>n>>m;
    adj.resize(n+1);
    for(int i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        adj[u].pub(v);
        adj[v].pub(u);
    }

    col.resize(n+1);
    veci ogc;
    for(int i=1;i<=n;i++)
    {
        cin>>col[i];
        ogc.pub(col[i]);
    }

    sort(all(ogc));
    ogc.erase(unique(all(ogc)),ogc.end());
    int mci=ogc.size();
    for(int i=1;i<=n;i++)
        col[i]=lower_bound(all(ogc),col[i])-ogc.begin()+1;

    veci dep1(n+1,-1);
    queue<int> q;
    q.push(1);
    dep1[1]=0;
    int L=1;
    while(q.size())
    {
        int u=q.front();
        q.pop();
        if(dep1[u]>dep1[L])
            L=u;
        for(int v:adj[u])
        {
            if(dep1[v]==-1)
            {
                dep1[v]=dep1[u]+1;
                q.push(v);
            }
        }
    }

    veci depl(n+1,-1);
    q.push(L);
    depl[L]=0;
    int R=L;
    while(q.size())
    {
        int u=q.front();
        q.pop();
        if(depl[u]>depl[R])
            R=u;
        for(int v:adj[u])
        {
            if(depl[v]==-1)
            {
                depl[v]=depl[u]+1;
                q.push(v);
            }
        }
    }

    ans.assign(n+1,0);
    cnt.assign(mci+1,0);
    dnt=0;
    st.clear();
    crd.assign(n+1,0);
    crh.assign(n+1,0);

    veci roots={L,R};
    for(int r:roots)
    {
        st.clear();
        dnt=0;
        fill(all(cnt),0);

        crd.assign(n+1,0);
        crh.assign(n+1,0);
        dfs1(r,0);
        dfs2(r,0);
    }

    for(int i=1;i<=n;i++)
        cout<<ans[i]<<"\n";
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    ios_base::sync_with_stdio(false);

    //ifstream fin("in.txt");
    //ofstream fout("out.txt");

    int t=1;
    //cin>>t;
    while(t--)
    {
        solve();
    }
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...