BZOJ 4027 [HEOI 2015] 兔子与樱花 解题报告
这个题看起来好神的感觉。实际上也好神。。。
我们可以考虑设 $f_u$ 表示以 $u$ 为根的子树中最多能删多少个点,
再设 $g_u$ 表示以 $u$ 为根的子树中删了 $f_u$ 个点之后,$u$ 的 $son(i) + c_i$ 的最小值。
然后就可以树形 Dp 啦。
转移的话,考虑 $u$ 的孙子及更后辈,有:
$$f_u += \sum_{v\in \{son_u\}}f_v$$
然后考虑可以 $u$ 的哪些儿子。
首先删掉一个点 $x$ 的话,会对 $fa_x$ 的载重产生 $g_x - 1$ 点个贡献,
所以我们就按照这个贡献来排序,然后贪心地从小到大来选择是否删掉这个点。
那么我们就能够对 $f_u$ 和 $g_u$ 进行转移了。
时间复杂度 $O(n\log n)$,应该是可以过的吧。。。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 2000000 + 5 int n, m, tot;
int C[N], Size[N], Head[N], F[N], G[N], q[N], T[N]; struct Edge
{
int next, node;
}h[N]; inline void addedge(int u, int v)
{
h[++ tot].next = Head[u];
Head[u] = tot;
h[tot].node = v;
} inline int getint()
{
char ch = '\n';
for (; ch > '' || ch < ''; ch = getchar()) ;
int res = ch - '';
for (ch = getchar(); ch >= '' && ch <= ''; ch = getchar())
res = (res << ) + (res << ) + ch - '';
return res;
} inline void Solve()
{
int l = , r = ;
q[] = ;
while (l <= r)
{
int z = q[l ++];
for (int i = Head[z]; i; i = h[i].next)
{
int d = h[i].node;
q[++ r] = d;
}
}
for (; r; r --)
{
int z = q[r];
F[z] = T[] = , G[z] = Size[z] + C[z];
for (int i = Head[z]; i; i = h[i].next)
{
int d = h[i].node;
F[z] += F[d];
T[++ T[]] = G[d] - ;
}
sort(T + , T + T[] + );
for (int i = ; i <= T[]; i ++)
{
if (G[z] + T[i] <= m)
G[z] += T[i], F[z] ++;
else break ;
}
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("4027.in", "r", stdin);
freopen("4027.out", "w", stdout);
#endif n = getint(), m = getint();
for (int i = ; i < n; i ++)
C[i] = getint();
for (int i = ; i < n; i ++)
{
Size[i] = getint();
for (int j = ; j <= Size[i]; j ++)
{
int d = getint();
addedge(i, d);
}
}
Solve();
printf("%d\n", F[]); #ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return ;
}
4027_Gromah
BZOJ 4027 [HEOI 2015] 兔子与樱花 解题报告的更多相关文章
- BZOJ 4027:[HEOI2015]兔子与樱花(贪心+树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4027 [题目大意] 樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- bzoj 4032 [ HEOI 2015 ] 最短不公共子串 —— 后缀自动机+序列自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 序列自动机其实就是每个位置记录一下某字母后面第一个出现位置,为了子序列能尽量长. 对字 ...
- [BZOJ 3145][Feyat cup 1.5]Str 解题报告
[Feyat cup 1.5]Str DescriptionArcueid,白姬,真祖的公主.在和推倒贵看电影时突然对一个问题产生了兴趣:我们都知道真祖和死徒是有类似的地方.那么从现代科学的角度如何解 ...
- BZOJ 3809Gty的二逼妹子序列 解题报告+data marker
--BZOJ http://www.lydsy.com/JudgeOnline/problem.php?id=3809 考虑对l,r跑莫队,对一组维护美丽度出现次数的桶修改, 然后把桶序列用分块维护查 ...
- BZOJ 3173 [Tjoi2013] 最长上升子序列 解题报告
这个题感觉比较简单,但却比较容易想残.. 我不会用树状数组求这个原排列,于是我只好用线段树...毕竟 Gromah 果弱马. 我们可以直接依次求出原排列的元素,每次找到最小并且最靠右的那个元素,假设这 ...
- BZOJ 4864: [BeiJing 2017 Wc]神秘物质 解题报告
4864: [BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微观粒子. ...
- 【BZOJ】【4027】【HEOI2015】兔子与樱花
贪心 树上贪心问题……跟APIO2015练习赛的C很像啊…… 我的思路是:从叶子向上考虑,令a[x]表示x这个节点上樱花数量与儿子个数的和(即对于任意的x,都有$a[x]\leq m$)每次从儿子的a ...
- 【BZOJ 4027】 4027: [HEOI2015]兔子与樱花 (贪心)
4027: [HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号 ...
随机推荐
- 嵌入式中 MMU的功能
学习嵌入式才发现要看的书太多,外面的世界很精彩啊,现在来说说MMU吧,MMU是Memory Management Unit的缩写,是用来管理虚拟内存系统的器件. MMU通常是CPU的一部分,本身有少量 ...
- SQLSERVER2000以上 Ad Hoc Distributed Queries的启用与关闭
SQLSERVER2000以上的版本在查询分析器中查询ACCESS数据时提示:“ 訊息 15281,層級 16,狀態 1,行 1SQL Server 已封鎖元件 'Ad Hoc Distributed ...
- php正则失效-最大回溯(pcre.backtrack_limit)/递归限制
有时候,我们觉得,没有什么可以让我们快乐,我们甚至忘记了如何微笑.但是,当我们被一群乐观.欢乐的人包围的时候,他们从内心深处散发出来的欢迎一定会感染你. 这组照片中,你会看到真正的幸福和快乐的面孔,我 ...
- 第三篇、C_双向链表(循环链表)
简介: 在用C/C++开发系统中,我们知道用数组或者单链表来开发,如果是数据比较大的话,性能很不好,效率也不高.因此常常需要考虑系统的实用性,常常采用双向链表来开发. 示例: 1.数据 typedef ...
- DataBase 总结开篇
系列说明 本系列将总结(SQL)数据库技术在日常开发中引用,读者群体假设为三类:没接触过SQL的入门程序员.有过一两年经验的程序员.三年以上接触过性能调优的程序员.按照这个分类本系列大体分为三篇 第一 ...
- ubuntu 恢复gnome-panel
Ubuntu重启panel 的方法首先进入终端, 依次输入以下命令1.gconftool --recursive-unset /apps/panel2.rm -rf ~/.gconf/apps/pan ...
- java_集合框架
一.集合框架图 二.Collection接口 Collection中可以存储的元素间无序,可以重复的元素. Collection接口的子接口List和Set,Map不是Collecti ...
- JS实现div块的拖放,调换位置
主要是HTML5 的拖放(Drag 和 Drop) 例子(不需要对div设置ID): <!DOCTYPE HTML> <html> <head> <scrip ...
- ubuntu获取硬盘的uuid。
1.用UUID来标识硬盘有很多好处,它是一个硬盘的唯一代号,所以当硬盘插口位置变化时,虽然sda可能会变成sdc,但这个码是不会变的.所以在 fstab中用/dev/sda1这样的硬盘标识可能会有混乱 ...
- checked
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" ...