求问一道题我的复杂度
  • 板块学术版
  • 楼主Noble_Wolf
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/19 20:11
  • 上次更新2024/11/19 20:12:54
查看原帖
求问一道题我的复杂度
421291
Noble_Wolf楼主2024/11/19 20:11

题意: 给定一棵有根树,第 i 个点有颜色 aia_i ,对于每个点 u 求最小的自然数 x ,满足不存在颜色为 x 的点以 u 为祖先。

我用了启发式合并,本人认为是O(nlogn+?)O(nlogn+?)的,我不确定的是代码中的

i=max(i,ans[v]);

是否能让复杂度均摊到O(n)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);
}
2024/11/19 20:11
加载中...