题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4027

Description

很久很久之前,森林里住着一群兔子。有一天,兔子们突然决定 要去看樱花。兔子们所在森林里的樱花树很特殊。樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它看成一个有 根树结构,其中0号节点是根节点。这个树的每个节点上都会有一些樱花,其中第i个节点有c_i朵樱花。樱花树的每一个节点都有最大的载重m,对于每一个节 点i,它的儿子节点的个数和i节点上樱花个数之和不能超过m,即son(i) + c_i <= m,其中son(i)表示i的儿子的个数,如果i为叶子节点,则son(i) = 0

现在兔子们觉得樱花树上节点太多,希望去掉一些节点。当一个节点被去掉之后,这个节点上的樱花和它的儿子节点都被连到删掉节点的父节点上。如果父节点也被删除,那么就会继续向上连接,直到第一个没有被删除的节点为止。
现在兔子们希望计算在不违背最大载重的情况下,最多能删除多少节点。
注意根节点不能被删除,被删除的节点不被计入载重。

Input

第一行输入两个正整数,n和m分别表示节点个数和最大载重

第二行n个整数c_i,表示第i个节点上的樱花个数
接下来n行,每行第一个数k_i表示这个节点的儿子个数,接下来k_i个整数表示这个节点儿子的编号

Output

一行一个整数,表示最多能删除多少节点。

Sample Input

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

Sample Output

4

HINT

对于100%的数据,1 <= n <= 2000000, 1 <= m <= 100000, 0 <= c_i <= 1000,数据保证初始时,每个节点樱花数与儿子节点个数之和大于0且不超过m

题解:
本来是想写一下动归的,在hzwer的博客的动归题里翻了一下,然后看到树形动规,觉得蛮好的,就写了一写,然后,这是个贪心。。。合并的话,是吧儿子的权值,和儿子的后代传给父亲,那么很容易想到的是,如果当前节点可以上传,那么如果他的儿子可以上传,尽量上传他的儿子,这样不会使结果更差,对答案的贡献都是一个,而且如果当前节点不上传,对于之后节点的上传会有好处。那么,可以得到一个贪心策略,可以把儿子能合并的尽量合并,先合并代价小的,再合并代价大的
代码解释:
c[]存的是每一个节点的代价,包含了其儿子个数,所以后面合并时要把两者代价和减1
代码:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#define N 2000010
using namespace std;
int sum,m,ans,n,T,p;
int head[N],next[N],to[N];
int a[N],c[N];
int getint()
{int res=0,w=1;char ch=getchar();while ((ch>'9' || ch<'0')&&ch!='-') ch=getchar();if (ch=='-') w=-1,ch=getchar();while (ch>='0'&&ch<='9') res=res*10+ch-'0',ch=getchar();return res*w;
}
void link(int x,int y) {next[++sum]=head[x]; head[x]=sum; to[sum]=y;}
void dfs(int p)
{for (int i=head[p];i;i=next[i]) dfs(to[i]);int k=0;for (int i=head[p];i;i=next[i]) a[++k]=c[to[i]];sort(a+1,a+1+k);for (int i=1;i<=k;i++){if (c[p]+a[i]-1<=m)c[p]+=a[i]-1,ans++;else break;}
}
int main()
{n=getint(); m=getint();for (int i=1;i<=n;i++) c[i]=getint();for (int i=1;i<=n;i++){T=getint(); c[i]+=T; while (T--)    {p=getint()+1; link(i,p); }}dfs(1);printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/xiaoqiang200015/p/5977418.html

bzoj4027,[HEOI2015]兔子与樱花相关推荐

  1. [BZOJ4027][HEOI2015]兔子与樱花(贪心)

    看到数据范围就大概只能想到这一种做法了吧. 首先实际上是每个点的权值为v[i]=c[i]+son[i],然后删除一个点就是v[fa[i]]+=v[i]-1. 从下往上贪心删,每次将节点的所有儿子按权值 ...

  2. [HEOI2015]兔子与樱花

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

  3. [HEOI2015] 兔子与樱花

    Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由 \(n\) 个树枝分叉点组成,编号从 \(0\) 到 \(n-1\ ...

  4. 洛谷P4107 [HEOI2015]兔子与樱花

    Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接 ...

  5. 【BZOJ4027】【HEOI2015】兔子与樱花 贪心

    链接: #include <stdio.h> int main() {puts("转载请注明出处[vmurder]谢谢");puts("网址:blog.csd ...

  6. 数据结构实验 7.兔子与樱花

    [问题描述] 很久很久之前,森林里住着一群兔子.有一天,兔子们希望去赏樱花,但当他们到了上野公园门口却忘记了带地图.现在兔子们想求助于你来帮他们找到公园里的最短路. [输入形式] 输入分为三个部分. ...

  7. #2311. 兔子与樱花 ( sakura )

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊. 樱花树由 n n n 个树枝分叉点组成,编号从 0 0 0 到 n − 1 n-1 n− ...

  8. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  9. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

最新文章

  1. 朱晔和你聊Spring系列S1E7:简单好用的Spring Boot Actuator
  2. 编写CGI小结(Java)
  3. office 安装错误 1920 osppsvc服务无法启动 failed to start
  4. 算法 - 普里姆算法(修路问题求解)
  5. linux 配置trac界面显示为中文,安装back|track 5 r3并配置中文界面简单教程
  6. foobar插件_如何为 caddy 添写自定义插件
  7. linux内存占用查看
  8. python wrapper_Python functools之partial, update_wrapper, wraps
  9. 2.1 全连接神经网络
  10. hihocoder 1513 小Hi的烦恼——bitset
  11. 机器学习特征与类型概述
  12. 三维点云数据处理软件供技术原理说明_三维扫描数据处理技术_点云数据处理...
  13. can卡通用测试软件LCANTest详细介绍
  14. 有源滤波器matlab/simulink 采用simulink搭建有源滤波器模型,有操作视频和报告资料,运行稳定,效果显著
  15. 基于SSM+SpringBoot+Vue+ElmentUI实现公司案件管理系统
  16. 华为防火墙nat技术之服务器映射
  17. 无损音乐刻录成cd有意义吗_无损和CD不一样?无损音乐的“玄学”知多少?
  18. 服务器支持 TLS Client-initiated 重协商攻击(CVE-2011-1473复现验证)
  19. 已加载插件:fastestmirror Loading mirror speeds from cached hostfile There are no enabled repos. Run “yum
  20. java中tip是什么意思_tip是什么意思

热门文章

  1. redis配置实例及redis.conf详细说明
  2. __doPostBack用法 【csdn】
  3. 利用windows优化大师软件卸载一手和清理一招
  4. crs 管理的几个演示(培训作业)
  5. Android studio 查找文件在电脑路径位置
  6. android 查找字符在字符串的位置
  7. android 验证码
  8. gulp es5语法转换及js/css/html压缩过程
  9. JVM—内存模型JMM
  10. 分布式文件系统—HDFS—核心设计