萌新求助
查看原帖
萌新求助
756336
李承轩楼主2023/10/5 18:27

WA #6

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10,Log_N=26;
int n,d;
int f[N][Log_N],dep[N];
vector<int> s,t;
void add(int x,int fa)
{
	dep[x]=dep[fa]+1,f[x][0]=fa;
	for(int i=1;i<Log_N;i++)
		f[x][i]=f[f[x][i-1]][i-1];
}
int lca(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	for(int i=Log_N-1;i>=0;i--)
		if(dep[f[x][i]]>=dep[y])x=f[x][i];
	for(int i=Log_N-1;i>=0;i--)
		if(dep[f[x][i]]!=dep[f[y][i]])
			x=f[x][i],y=f[y][i];
	return x==y?x:f[x][0];
}
int dis(int x,int y){return dep[x]+dep[y]-2*dep[lca(x,y)];}
signed main()
{
	scanf("%lld",&n);
	s.push_back(1);
	for(int i=2,x;i<=n+1;i++)
	{
		scanf("%lld",&x);
		add(i,x);
		int sdis=0,tdis=0;
		if(!s.empty())sdis=dis(i,s[0]);
		if(!t.empty())tdis=dis(i,t[0]);
		if(sdis>d||tdis>d)
		{
			d=max(sdis,tdis);
			if(d==sdis)
			{
				for(int j=0;j<t.size();j++)
					if(dis(i,t[j])==d)s.push_back(t[j]);
				t.clear();
				t.push_back(i);
			}
			else if(d==tdis)
			{
				for(int j=0;j<s.size();j++)
					if(dis(i,s[j])==d)t.push_back(s[j]);
				s.clear();
				s.push_back(i);
			}
		}
		else
		{
			if(sdis==d)t.push_back(i);
			else if(tdis==d)s.push_back(i);
		}
		printf("%lld\n",s.size()+t.size());
	} 
}
2023/10/5 18:27
加载中...