[HEOI2015]兔子与樱花

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 1320  Solved: 762
[Submit][Status][Discuss]

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
 

Source

题解:

   树形贪心。对于任意一个节点,它当前的权值为c[i]+son[i]。

   假设我们删除了它的某一个儿子节点j,则权值增加c[j]+son[j]-1。

   那么显然,我们在删除节点的时候,应该从权值最小的到最大的依次进行,直到当前节点的权值已经超过限重。

 #include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<vector> #define N 2000007
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if (ch=='-') f=-;ch=getchar();}
while(ch<=''&&ch>=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m,ans;
int c[N];
vector<int>e[N]; bool cmp(int a,int b){return c[a]<c[b];}
void dfs(int x)
{
for(int i=;i<e[x].size();i++)
dfs(e[x][i]);
sort(e[x].begin(),e[x].end(),cmp);
c[x]+=e[x].size();
for(int i=;i<e[x].size();i++)
{
int t=c[e[x][i]];
if(c[x]+t-<=m)
{
c[x]+=t-;
ans++;
}
}
}
int main()
{
n=read();m=read();
for(int i=;i<n;i++)
c[i]=read();
for(int i=,x,y;i<n;i++)
{
x=read();
while(x--)
{
y=read();
e[i].push_back(y);
}
}
dfs(),printf("%d\n",ans);
}

最新文章

  1. js最佳继承范型
  2. java之设计模式
  3. Spring MVC @ResponseBody返回中文字符串乱码问题
  4. php wampserver 80 端口无法开启的解决方法
  5. WCF netTcp配置
  6. DDD:一个朋友对领域驱动的小结
  7. Java log code example
  8. phpcms常用接口调用方法
  9. easyui源码翻译1.32--TreeGrid(树形表格)
  10. 读写应用程序数据-NSUserDefault、对象归档(NSKeyedArchiver)、文件操作
  11. Windows Latex 中日文字体设置例
  12. 一种H.264高清视频的无参考视频质量评价算法(基于QP和跳过宏块数)
  13. cocos2dx 制作单机麻将(二)
  14. Java面试01|JVM相关
  15. 201521123011《Java程序设计》 第12周学习总结
  16. 【原创】python实现清理本地缓存垃圾
  17. Gym 100952H&amp;&amp;2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】
  18. Java修改maven的默认jdk版本为1.7
  19. 【安卓中的缓存策略系列】安卓缓存策略之磁盘缓存DiskLruCache
  20. 无代理处理post非简单请求跨域问题

热门文章

  1. ibatis学习笔记
  2. 回顾PMP考试
  3. jdbc获取数据具体过程
  4. cnbeta新闻资讯第三方客户端应用
  5. asp.net mvc 5 微信接入VB版 - 接入认证
  6. 阿里云服务器ECS部署应用教程
  7. Python3基础教程(十六)—— 迭代器、生成器、装饰器
  8. 查看python关键字
  9. MFC不同分辨率和缩放下正常显示的方法
  10. Eaton Char-Lynn Motor : Performance Of Small Displacement Motors