记录编号 197544 评测结果 AAAAAAAAAA
题目名称 [HEOI 2015] 兔子与樱花 最终得分 100
用户昵称 Gravatarzys 是否通过 通过
代码语言 C++ 运行时间 3.574 s
提交时间 2015-10-24 07:34:49 内存使用 40.36 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<queue>
  3. #include<algorithm>
  4.  
  5. using namespace std;
  6.  
  7. bool vis[2000010];
  8. int n,m,first[2000010],tot;
  9. int ver[2000010],son[2000010],Ans;
  10.  
  11. struct Edge{
  12. int v,next;
  13. }edge[2000010];
  14.  
  15. struct My_define{
  16. int id,w;
  17. friend bool operator < (My_define a,My_define b){
  18. return a.w>b.w;
  19. }
  20. }temp,tmp;
  21.  
  22. void Add(int u,int v)
  23. {
  24. edge[++tot].v=v;
  25. edge[tot].next=first[u];
  26. first[u]=tot;
  27. }
  28.  
  29. void Tree_DP(int rt)
  30. {
  31. if(!son[rt])return;
  32. priority_queue<My_define>q;
  33. while(!q.empty())q.pop();
  34. for(int i=first[rt];i!=-1;i=edge[i].next){
  35. Tree_DP(edge[i].v);temp.id=edge[i].v;
  36. temp.w=son[edge[i].v]+ver[edge[i].v];
  37. q.push(temp);
  38. }
  39. while(true){
  40. if(!q.empty()){
  41. temp=q.top();q.pop();
  42. if(son[rt]+ver[rt]+temp.w-1<=m){
  43. vis[temp.id]=1;Ans++;
  44. ver[rt]+=ver[temp.id];
  45. son[rt]+=son[temp.id]-1;
  46. continue;
  47. }
  48. else break;
  49. }
  50. else break;
  51. }
  52. }
  53.  
  54. int main()
  55. {
  56. freopen("sakura.in","r",stdin);
  57. freopen("sakura.out","w",stdout);
  58. scanf("%d%d",&n,&m);
  59. for(int i=0;i<=n;i++)first[i]=-1;
  60. for(int i=0;i<n;i++)scanf("%d",&ver[i]);
  61. for(int i=0;i<n;i++){
  62. scanf("%d",&son[i]);
  63. for(int j=1,v;j<=son[i];j++){
  64. scanf("%d",&v);
  65. Add(i,v);
  66. }
  67. }Tree_DP(0);
  68. printf("%d",Ans);
  69. }