【HEOI】兔子与樱花

来源:互联网 发布:ins发生未知网络错误 编辑:程序博客网 时间:2024/04/28 06:10

贪心

删掉一个点的代价可知

那么通过DFS在处理出来儿子的信息后将所有儿子的代价排序,贪心地看一下是否可以删掉

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int Maxn = 2000010;struct node {    int to,next;    }E[Maxn];int n,m,Ans,tot,c[Maxn],H[Maxn],a[Maxn];void Link(int u,int v){    E[++tot].to = v;    E[tot].next = H[u];    H[u] = tot;}void Dfs(int x){    for(int i=H[x];i;i=E[i].next)Dfs(E[i].to);    int js = 0;    for(int i=H[x];i;i=E[i].next)a[++js] = c[E[i].to];    sort(a + 1,a + js + 1);    for(int i=1;i<=js;i++){        if(c[x] + a[i] - 1 > m)break;//If i Can Be Delete        c[x] += a[i] - 1;Ans++;    }}int main(){   freopen("sakura.in","r",stdin);   freopen("sakura.out","w",stdout);    scanf("%d%d",&n,&m);    for(int i=0;i<n;i++)scanf("%d",&c[i]);    for(int i=0;i<n;i++){        int k;scanf("%d",&k);c[i] += k;//C[i] Is The Node's Value        for(int j=1;j<=k;j++){            int x;scanf("%d",&x);            Link(i,x);        }    }    Dfs(0);    printf("%d\n",Ans);    // while(1);    return 0;}
0 0
原创粉丝点击