# include <iostream>
# include <vector>
# include <algorithm>
# include <set>
using namespace std;
const int MAX=2e5+11;
int n,k,root;
vector<int> adj[MAX];
int col[MAX];
int ct;
int a[MAX];
vector<int> app[MAX];
void dfs_init(int curr, int par)
{
ct++;
a[ct]=col[curr];
app[col[curr]].push_back(ct);
for(int nxt: adj[curr])
{
if(nxt==par) continue;
dfs_init(nxt,curr);
}
}
vector<int> g[MAX*4];
vector<int> g2[MAX*4];
int col2[MAX*4];
int leaf[MAX];
void add_edge(int u, int v)
{
g[u].push_back(v);
g2[v].push_back(u);
}
void build(int v=1, int l=1, int r=n)
{
if(l==r)
{
leaf[a[l]]=v;
col2[v]=a[l];
return ;
}
int mid=(l+r)/2;
add_edge(v,v*2);
add_edge(v,v*2+1);
build(v*2,l,mid);
build(v*2+1,mid+1,r);
}
void add(int from, int le, int ri, int v=1, int l=1, int r=n)
{
if(ri<l or r<le) return ;
if(le<=l and r<=ri)
{
add_edge(from,v);
return ;
}
int mid=(l+r)/2;
add(from,le,ri,v*2,l,mid);
add(from,le,ri,v*2+1,mid+1,r);
}
bool vis[MAX*4];
vector<int> order;
void dfs_order(int curr)
{
vis[curr]=1;
for(int nxt: g[curr])
{
if(!vis[nxt]) dfs_order(nxt);
}
order.push_back(curr);
}
set<int> s;
void dfs_scc(int curr)
{
vis[curr]=1;
if(col2[curr]!=0) s.insert(col2[curr]);
for(int nxt: g2[curr])
{
if(!vis[nxt]) dfs_scc(nxt);
}
}
void scc()
{
for(int i=1;i<=n*4;i++)
{
if(!vis[i]) dfs_order(i);
}
for(int i=1;i<=n*4;i++) vis[i]=0;
reverse(order.begin(),order.end());
int ans=1e9;
for(int x: order)
{
if(!vis[x])
{
s.clear();
dfs_scc(x);
if(s.size()!=0) ans=min(ans,(int)s.size());
}
}
cout<<ans<<"\n";
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int i=1;i<n;i++)
{
int u,v;
cin>>u>>v;
adj[u].push_back(v);
adj[v].push_back(u);
}
for(int i=1;i<=n;i++) cin>>col[i];
for(int i=1;i<=n;i++) if(adj[i].size()==1) {root=i;break;}
dfs_init(root,0);
ct=0;
build();
for(int i=1;i<=k;i++)
{
int l=app[i][0],r=app[i].back();
add(leaf[i],l,r);
}
scc();
return 0;
}
# | 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... |