【bzoj4027】 [HEOI2015]兔子与樱花

自底向上贪心。

每次给儿子排序,贪心地从小到大删,直到不能删。

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;

#define N 2000010

int n,m;

struct edge
{
	int to,next;
}e[N];
int head[N<<1];
int cnt;

int a[N],c[N];

int ans;
int x,xx;

void link(int u,int v)
{
	e[++cnt]=(edge){v,head[u]};
	head[u]=cnt;
}

void dfs(int x)
{
	for (int i=head[x];i;i=e[i].next)
		dfs(e[i].to);
	cnt=0;
	for (int i=head[x];i;i=e[i].next)
		c[++cnt]=a[e[i].to];
	sort(c+1,c+cnt+1);
	for (int i=1;i<=cnt;i++)
	{
		if (a[x]+c[i]-1>m)
			break;
		a[x]+=(c[i]-1),ans++;
	}
}

int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		a[i]+=x;
		for (int j=1;j<=x;j++)
			scanf("%d",&xx),link(i,xx+1);
	}
	dfs(1);
	printf("%d\n",ans);
	return 0;
}

  

posted @ 2016-07-12 16:50  Yangjiyuan  阅读(375)  评论(0编辑  收藏  举报