1 条题解
-
0
每次删除深度根结点的儿子中深度最大的子树显然是正确的,直接贪心即可。
#include <bits/stdc++.h> using namespace std; int d[200012]; struct F { int to[400012], ns[400012], fs[400012], m; void adds(int f, int t) { m++; to[m] = t; ns[m] = fs[f]; fs[f] = m; } void add(int f, int t) { adds(f, t); adds(t, f); } }; F w; int f[200012]; priority_queue <long long> pq; int main() { int n; cin >> n; for (int i = 2; i <= n; i++) { cin >> f[i]; w.add(i, f[i]); } for (int i = n; i >= 2; i--) { d[f[i]] = max(d[f[i]], d[i] + 1); if (f[i] == 1) pq.push(d[i] * 1000000ll + i); } pq.push(0); long long ans = n - 2; for (int _ = 1; _ <= n - 1; _++) { long long c = pq.top() % 1000000; pq.pop(); int ii = w.fs[c]; while (ii) { if (w.to[ii] != f[c]) pq.push(d[w.to[ii]] * 1000000ll + w.to[ii]); ii = w.ns[ii]; } ans += pq.top() / 1000000; } cout << ans << endl; return 0; }
- 1
信息
- ID
- 242
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 4
- 已通过
- 4
- 上传者