1 条题解

  • 0
    @ 2026-4-5 11:11:53

    每次删除深度根结点的儿子中深度最大的子树显然是正确的,直接贪心即可。

    #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
    上传者