别人家的省选T_T
直接sb贪心就好了。。每次选最小的。。
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#define N 2000005
using namespace std;
int n,m,ans,c[N];
vector<int> a[N];
inline int read()
{
int a=0,f=1; char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
return a*f;
}
inline bool cmp(int a,int b)
{
return c[a]<c[b];
}
void dfs(int x)
{
c[x]+=a[x].size();
for (int i=0;i<a[x].size();i++) dfs(a[x][i]);
sort(a[x].begin(),a[x].end(),cmp);
for (int i=0;i<a[x].size();i++)
if (c[x]+c[a[x][i]]-1<=m)
c[x]+=c[a[x][i]]-1,ans++;
else break;
}
int main()
{
n=read(); m=read();
for (int i=0;i<n;i++) c[i]=read();
for (int i=0;i<n;i++)
{
int x=read();
while (x--)
{
int y=read();
a[i].push_back(y);
}
}
dfs(0);
cout << ans;
return 0;
}