#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 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... |