| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 38630 | 申东铉 | 【J】T4 | C++ | 通过 | 100 | 432 MS | 130952 KB | 1720 | 2025-10-18 13:53:24 |
#include <bits/stdc++.h> #define int long long using namespace std; int n; vector <int> e[1000006]; int d[1000006]; int cnt[1000006],sz[1000006]; bool vis[1000006]; int fa[1000006]; int sum; vector <int> vc; inline void dfs (int u) { vis[u] = 1; sz[u] = 1; cnt[u] = (d[u] == 3); for (auto v : e[u]) { if (vis[v]) { fa[u] = v; continue; } dfs(v); cnt[u] += cnt[v]; sz[u] += sz[v]; } if (cnt[u] == 1 && d[u] == 3) { vc.push_back(u); } return; } signed main () { ios::sync_with_stdio(); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1;i < n;i++) { int u = i + 1,v; cin >> v; e[u].push_back(v); e[v].push_back(u); d[u]++; d[v]++; } int rt = 1; for (int i = 1;i <= n;i++) { if (d[i] > 3) { cout << 0 << endl; return 0; } if (d[i] == 3) { rt = i; sum++; } } if (sum == 0) { cout << n * (n - 1) / 2 << endl; return 0; } dfs(rt); if (sum == 1) { int ans = (n - 1) * (n - 1); for (auto at : e[rt]) { ans -= sz[at] * sz[at]; } cout << ans / 2 << endl; return 0; } for (auto at : e[rt]) { if (at == fa[rt]) { continue; } if (cnt[at] == sum - 1) { vc.push_back(rt); } } if (vc.size() > 2) { cout << 0 << endl; return 0; } int x = n - 1,y = n - 1; for (auto at : e[vc[0]]) { if (at == fa[vc[0]]) { continue; } if (cnt[at] > 0) { x -= sz[at]; } } if (cnt[vc[0]] < sum) { x -= (n - sz[vc[0]]); } for (auto at : e[vc[1]]) { if (at == fa[vc[1]]) { continue; } if (cnt[at] > 0) { y -= sz[at]; } } if (cnt[vc[1]] < sum) { y -= (n - sz[vc[1]]); } cout << x * y << endl; return 0; }