#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |