题意:
给定一棵有根树,第 i
个点有颜色 ai
,对于每个点 u
求最小的自然数 x
,满足不存在颜色为 x
的点以 u
为祖先。
我用了启发式合并,本人认为是O(nlogn+?)的,我不确定的是代码中的
i=max(i,ans[v]);
是否能让复杂度均摊到O(n)?
multiset<int>s[N];
void merge(int u,int v){
if(s[u].size()<s[v].size())swap(s[u],s[v]);
for(int i:s[v])if(!s[u].count(i))s[u].insert(i);
}
void dfs(int u){
s[u].insert(a[u]);
int i=0;
for(int j=head[u];j;j=e[j].nxt){
int v=e[j].v;
dfs(v);
merge(u,v);
i=max(i,ans[v]);
}
for(i=i;i<=n+1;i++)if(!s[u].count(i)){ans[u]=i;break;}
}
int main(){
n=rd();
for(int i=1;i<=n;++i)a[i]=rd();
for(int i=2;i<=n;++i)add(rd(),i);
dfs(1);
}