求助CF1009F
  • 板块灌水区
  • 楼主hjfjwl
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/12 19:29
  • 上次更新2025/1/13 08:45:18
查看原帖
求助CF1009F
374715
hjfjwl楼主2025/1/12 19:29

在 codeforces 上面评测结果是第 8888 个测试点 TLE

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int head[N];
int nxt[N];
int to[N];
int id;
void add(int x,int y)
{
	nxt[++id] = head[x];
	head[x] = id;
	to[id] = y;
}
int maxn;
int tot;
int cnt[N];
int son[N];
int dep[N];
int siz[N];
void dfs(int u,int fa){
	siz[u] = 1;
	dep[u] = dep[fa] + 1;
	for(register int i = head[u];i;i = nxt[i])
	{
		int v = to[i];
		if(v == fa)continue;
		dfs(v,u);
		siz[v] += siz[u];
		if(siz[son[u]] < siz[v])
		{
			son[u] = v;
		}
	}
}
int Son;
void update(int u,int fa,int val)
{
	cnt[dep[u]] += val;
	if(cnt[dep[u]] > maxn)
	{
		maxn = cnt[dep[u]];
		tot = dep[u];
	}
	else if(cnt[dep[u]] == maxn && dep[u] < tot)
	{
		tot = dep[u];
	}
	for(register int i = head[u];i;i = nxt[i])
	{
		int v = to[i];
		if(v == fa || v == Son)continue;
		update(v,u,val);
	}
}
int ans[N];
void dsu(int u,int fa,int opt)
{
	for(register int i = head[u];i;i = nxt[i])
	{
		int v = to[i];
		if(v == fa || v == son[u])continue;
		dsu(v,u,0);
	}
	if(son[u])
	{
		dsu(son[u],u,1);
	}
	Son = son[u];
	update(u,fa,1);
	Son = 0;
	//cout << maxn << endl;
	ans[u] = tot - dep[u];
	if(opt == 0)
	{
		update(u,fa,-1);
		tot = maxn = 0;
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0); 
	int n;
	cin >> n;
	for(register int i = 1;i < n;i++)
	{
		int u,v;
		cin >> u >> v;
		add(u,v);
		add(v,u);
	}
	dfs(1,0);
	dsu(1,0,1);
	for(register int i = 1;i <= n;i++)
	{
		cout << ans[i] << endl;
	}
	return 0;
 } 
2025/1/12 19:29
加载中...