提交时间:2025-10-18 15:22:05

运行 ID: 38658

#include<bits/stdc++.h> using namespace std; const int N = 1e6+10; int n,rt,d[N],siz[N],dep[N],fr[N],s[N][2],f[N]; long long ans; vector<int> G[N]; void dfs(int x,int fa){ siz[x]=1; dep[x]=dep[fa]+1; f[x]=fa; for(int i=0;i<G[x].size();i++){ int v=G[x][i]; if(v==fa) continue; dfs(v,x); siz[x]+=siz[v]; } } void dfs2(int x,int fa){ for(int i=0;i<G[x].size();i++){ int v=G[x][i]; if(v==fa) continue; if(x!=rt){ fr[v]=fr[x]; s[fr[v]][0]=siz[v]; s[fr[v]][1]=v; } else fr[v]=v; dfs2(v,x); } } int main(){ cin>>n; for(int i=1;i<=n-1;i++){ int x; cin>>x; G[i+1].push_back(x); G[x].push_back(i+1); d[x]++; d[i+1]++; } bool flag=true,flag2=false; for(int i=1;i<=n;i++){ if(d[i]>=3){ flag=false; if(d[i]>3) flag2=true; } } if(flag){ ans=(long long)n*((long long)n-1ll)/2ll; cout<<ans<<endl; return 0; } if(flag2){ cout<<0<<endl; return 0; } int cnt=0; for(int i=1;i<=n;i++){ if(d[i]==3){ cnt++; rt=i; } } if(cnt==1){ dfs(rt,0); int x=G[rt][0],y=G[rt][1],z=G[rt][2]; ans=ans+(long long)siz[x]*(long long)siz[y]; ans=ans+(long long)siz[x]*(long long)siz[z]; ans=ans+(long long)siz[y]*(long long)siz[z]; cout<<ans<<endl; return 0; } dfs(rt,0); dfs2(rt,0); if(s[G[rt][0]][0]!=0&&s[G[rt][1]][0]!=0&&s[G[rt][2]][0]!=0){ cout<<0<<endl; return 0; } if(s[G[rt][0]][0]==0){ int now=s[G[rt][1]][1],now2=s[G[rt][2]][1]; int tot=0; while(now!=rt){ if(d[now]==3) tot++; now=f[now]; } while(now2!=rt){ if(d[now2]==3) tot++; now2=f[now2]; } if(tot!=cnt){ cout<<0<<endl; } else{ ans=(long long)s[G[rt][1]][0]*(long long)s[G[rt][2]][0]; cout<<ans<<endl; } } if(s[G[rt][1]][0]==0){ int now=s[G[rt][0]][1],now2=s[G[rt][2]][1]; int tot=0; while(now!=rt){ if(d[now]==3) tot++; now=f[now]; } while(now2!=rt){ if(d[now2]==3) tot++; now2=f[now2]; } if(tot!=cnt){ cout<<0<<endl; } else{ ans=(long long)s[G[rt][0]][0]*(long long)s[G[rt][2]][0]; cout<<ans<<endl; } } if(s[G[rt][2]][0]==0){ int now=s[G[rt][1]][1],now2=s[G[rt][0]][1]; int tot=0; while(now!=rt){ if(d[now]==3) tot++; now=f[now]; } while(now2!=rt){ if(d[now2]==3) tot++; now2=f[now2]; } if(tot!=cnt){ cout<<0<<endl; } else{ ans=(long long)s[G[rt][1]][0]*(long long)s[G[rt][0]][0]; cout<<ans<<endl; } } return 0; }