Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
38610 daimo 【J】T4 C++ 解答错误 90 308 MS 129556 KB 2784 2025-10-18 13:36:24

Tests(19/21):


#include<bits/stdc++.h> #define __ __int128 using namespace std; void testread(){ freopen("flower.in","r",stdin); freopen("flower.out","w",stdout); } vector<int>g[1000010]; int n; int sum_3,sum[3],max_sum[3],len[3]; vector<int>node_3[3]; int fa[1000010]; void check_dfs(int x,int k,int lst){ fa[x]=lst; if(g[x].size()==3)sum[k]++,max_sum[k]=max(sum[k],max_sum[k]),node_3[k].push_back(x); for(int i=0;i<g[x].size();i++){ if(g[x][i]!=fa[x])check_dfs(g[x][i],k,x); } sum[k]--; } long long siz[3]; void dfs(int x,int k,int lst){ for(int i=0;i<g[x].size();i++){ if(g[x][i]!=lst){siz[k]++;dfs(g[x][i],k,x);} } } signed main(){ //testread(); ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int _; //cin>>_; _=1; while(_--){ cin>>n; for(int i=1;i<n;i++){ int v; cin>>v; g[i+1].push_back(v); g[v].push_back(i+1); } bool flag=0; for(int i=1;i<=n;i++){ if(g[i].size()>3){flag=1;break;} } if(flag){cout<<0;return 0;} int be=0; sum_3=0; for(int i=1;i<=n;i++){ if(g[i].size()==3){be=i;sum_3++;} } if(be==0){ cout<<(n*(n-1))/2<<endl; return 0; } check_dfs(g[be][0],0,be); check_dfs(g[be][1],1,be); check_dfs(g[be][2],2,be); int s=max_sum[0]+max_sum[1]+max_sum[2]+1; if(s!=sum_3){ cout<<0<<endl; return 0; } if(max_sum[0]!=0&&max_sum[1]!=0&&max_sum[2]!=0){ cout<<0<<endl; return 0; } if(max_sum[0]!=0)siz[0]=0,dfs(node_3[0][node_3[0].size()-1],0,fa[node_3[0][node_3[0].size()-1]]); else siz[0]=1,dfs(g[be][0],0,be); if(max_sum[1]!=0)siz[1]=0,dfs(node_3[1][node_3[1].size()-1],1,fa[node_3[1][node_3[1].size()-1]]); else siz[1]=1,dfs(g[be][1],1,be); if(max_sum[2]!=0)siz[2]=0,dfs(node_3[2][node_3[0].size()-1],2,fa[node_3[2][node_3[0].size()-1]]); else siz[2]=1,dfs(g[be][2],2,be); if(max_sum[0]==0&&max_sum[1]!=0&&max_sum[2]!=0)cout<<siz[1]*siz[2]; if(max_sum[1]==0&&max_sum[0]!=0&&max_sum[2]!=0)cout<<siz[0]*siz[2]; if(max_sum[2]==0&&max_sum[1]!=0&&max_sum[0]!=0)cout<<siz[1]*siz[0]; if(max_sum[0]==0&&max_sum[1]==0&&max_sum[2]!=0)cout<<(siz[1]+siz[0])*siz[2]; if(max_sum[0]==0&&max_sum[2]==0&&max_sum[1]!=0)cout<<(siz[2]+siz[0])*siz[1]; if(max_sum[2]==0&&max_sum[1]==0&&max_sum[0]!=0)cout<<(siz[1]+siz[2])*siz[0]; if(max_sum[2]==0&&max_sum[1]==0&&max_sum[0]==0)cout<<(siz[1]+siz[2])*siz[0]+siz[1]*siz[2]; } return 0; }


测评信息: