NC20548. [HEOI2015]兔子与樱花
描述
输入描述
第一行输入两个正整数,n和m分别表示节点个数和最大载重第二行n个整数ci,表示第i个节点上的樱花个数接下来n行,每行第一个数ki表示这个节点的儿子个数,接下来ki个整数表示这个节点儿子的编号
输出描述
一行一个整数,表示最多能删除多少节点。
示例1
输入:
10 4 0 2 2 2 4 1 0 4 1 1 3 6 2 3 1 9 1 8 1 1 0 0 2 7 4 0 1 5 0
输出:
4
C++11(clang++ 3.9) 解法, 执行用时: 1018ms, 内存消耗: 93688K, 提交时间: 2019-03-09 14:13:36
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> using namespace std; int n,m,a[2000001],k,ans; vector<int> c[2000001]; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0' || ch>'9') {if(ch=='-') f=-1;ch=getchar();} while(ch>='0' && ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*f; } bool cmp(int u,int v) { return a[u]<a[v]; } void dfs(int u) { for(int i=c[u].size()-1;~i;i--) dfs(c[u][i]); sort(c[u].begin(),c[u].end(),cmp); int len=c[u].size()-1; for(int i=0;i<=len;i++) if(a[c[u][i]]+a[u]-1<=m) a[u]+=a[c[u][i]]-1,ans++; else break; } int main() { n=read();m=read(); for(int i=0;i<n;i++) a[i]=read(); for(int i=0;i<n;i++) { k=read();a[i]+=k; for(int j=k;j;j--) k=read(),c[i].push_back(k); } dfs(0); printf("%d\n",ans); return 0; }