本题数据中,除了一条链的情况,其余都<=50。导致 Θ(nh)\Theta(nh) 的做法可以通过。

猜测数据是随机生成的树,导致期望树高为 logn\log n

#include<bits/stdc++.h>
#define int long long
#define R(x) x=read()
using namespace std;
inline int read() {
	int x=0,y=1;
	char e=getchar();
	while(e>'9'||e<'0') {
		if(e=='-')y=-1;
		e=getchar();
	}
	while(e>='0'&&e<='9') {
		x=(x<<3)+(x<<1)+(e^'0');
		e=getchar();
	}
	return x*y;
}
const int N=200005;
int n;
vector<int>G[N];
int dp[N],lst[N],dep[N],cnt[N];
int mx[N][55];
void bao(int u) {
//	dp[u]=1;
	if(u!=1&&G[u].size()==1) {
		lst[u]=0;
		return ;
	}
	for(auto v:G[u]) {
		if(dep[v])continue;
		dep[v]=dep[u]+1;
		bao(v);
		lst[u]=min(lst[u],lst[v]+1);
		mx[u][dep[v]]=max(mx[u][dep[v]],dp[v]);
		for(int i=0; i<=50; ++i) {
			mx[u][i]=max(mx[u][i],mx[v][i]);
		}
	}
	if(lst[u]+dep[u]<=50) dp[u]=max(1ll,mx[u][lst[u]+dep[u]]+1);
}
signed main() {
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	R(n);
	for(int i=2,f; i<=n; ++i) {
		R(f);
		G[i].push_back(f);
		G[f].push_back(i);
	}
	int cnt=0;
	for(int i=2; i<=n; ++i) {
		if(G[i].empty())++cnt;
	}
	if(cnt==1) {
		cout<<"1\n";
		return 0;
	}
	memset(lst,0x3f,sizeof lst);
//	memset(mx,0xc0,sizeof mx);
	dep[1]=1;
	bao(1);
	cout<<max(1ll,dp[1]);
	return 0;
}

0 条评论

目前还没有评论...

信息

ID
446
时间
1000ms
内存
256MiB
难度
8
标签
(无)
递交数
16
已通过
5
上传者