1. 程式人生 > >【Mail.Ru Cup 2018 Round 3 D. Decorate Apple Tree】排序+思維

【Mail.Ru Cup 2018 Round 3 D. Decorate Apple Tree】排序+思維


D. Decorate Apple Tree

題意

給你一棵樹每個葉子節點上都有一個顏色,
如果某個節點是好節點,要滿足他子樹內所有的葉子節點顏色不同
k [ 1

, n ] 對每個k\in[1,n] 輸出至少有k個點為好點最少需要多少種顏色

做法

每次選出的k個點最後只有一個點是有效的,也就是子樹葉子節點最多的那個點
選n個點時一定是根,選n-1個點時一定是去掉根之後包含葉子節點最多的點
繼續往下同理,而一棵樹的點一共有n個,所以只要對n個節點按照包含葉子節點的個數排序
之後輸出就可以了。

程式碼

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1e5+5;
vector<int> G[maxn];
vector<int> ans;
int sum[maxn];
void dfs(int u)
{
    if(G[u].size()==0)
    {
        sum[u]=1;
        return ;
    }
for(int i=0;i<G[u].size();i++) { dfs(G[u][i]); sum[u]+=sum[G[u][i]]; } return ; } int main() { int n,x; scanf("%d",&n); for(int i=2;i<=n;i++) { scanf("%d",&x); G[x].push_back(i); } dfs(1); sort(sum+1,sum+1+n); for(int i=1;i<=n;i++) printf("%d ",sum[i]); return 0; }