求助DSU on tree
查看原帖
求助DSU on tree
708103
封禁用户楼主2022/4/1 21:27

TLE on test 97

#include <bits/stdc++.h>
using namespace std;
int d[1000005],sz[1000005],big[1000005],cnt[1000005],ans[1000005],n,res=0;
vector<int> nodes[1000005];
void add(int de)
{
	cnt[de]++;
	if(cnt[de]>cnt[res]||(cnt[de]==cnt[res]&&de<res))res=de;
	return;
}
void del(int de)
{
	cnt[de]--;
	return;
}
void dfs2(int u,int fa,bool keep)
{
	if(keep)add(d[u]);
	else del(d[u]);
	for(int v:nodes[u])if(v!=fa)dfs2(v,u,keep);
	return;
}
void dfs1(int u,int fa)
{
	for(int v:nodes[u])
	{
		if(v==fa||v==big[u])continue;
		dfs1(v,u);
		dfs2(v,u,false);
		res=0;
	}
	if(big[u])dfs1(big[u],u);
	for(int v:nodes[u])if(v!=fa&&v!=big[u])dfs2(v,u,true);
	add(d[u]);
	ans[u]=res-d[u];
	return;
}
void dfs0(int u,int fa)
{
	sz[u]=1,d[u]=d[fa]+1;
	for(int v:nodes[u])if(v!=fa)dfs0(v,u);
	if(sz[u]>sz[big[fa]])big[fa]=u;
	return;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d %d",&u,&v);
		nodes[u].push_back(v);
		nodes[v].push_back(u);
	}
	dfs0(1,0);
	dfs1(1,0);
	for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
	return 0;
}
2022/4/1 21:27
加载中...