【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;
}

浙公网安备 33010602011771号