我最后用了两种写法
第一种:在处理结束后直接枚举i从1到n输出答案,代码是这样的
fr(i,1,n)
if(tr[rt[i]].dat)
printf("%d\n",xx[tr[rt[i]].ans]);
else puts("0");
第二种:在dfs合并的时候计算并存入ans数组
代码
void dfs1(int x,int fa){
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa)continue;
dfs1(y,x);
rt[x]=merge(rt[x],rt[y],1,mx);
}
if(tr[rt[x]].dat)ans[x]=xx[tr[rt[x]].ans];
}
第一种35分,第二种AC。。。
萌新求教。。。