- 【2025-10-02 P2】 tree
数据有待加强
- @ 2025-10-2 13:58:13
本题数据中,除了一条链的情况,其余都<=50。导致 的做法可以通过。
猜测数据是随机生成的树,导致期望树高为
#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
- 上传者