BZOJ 4027: [HEOI2015]兔子与樱花 树上dp
2015-05-28 15:57
190 查看
[b]4027: [HEOI2015]兔子与樱花[/b]
Time Limit: 20 Sec Memory Limit: 256 MB题目连接
http://www.lydsy.com/JudgeOnline/problem.php?id=4027Description
很久很久之前,森林里住着一群兔子。有一天,兔子们突然决定要去看樱花。兔子们所在森林里的樱花树很特 殊。樱花树由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现在兔子们觉得樱花树上节点太多,希望去掉一些节点。当一个节点被去掉之后,这个节点上的樱花和它的儿子节点都被连到删掉节点的父节点上。如果父节点也被删除,那么就会继续向上连接,直到第一个没有被删除的节点为止。
现在兔子们希望计算在不违背最大载重的情况下,最多能删除多少节点。
注意根节点不能被删除,被删除的节点不被计入载重。
[b]Input[/b]
第一行输入两个正整数,n和m分别表示节点个数和最大载重
第二行n个整数c_i,表示第i个节点上的樱花个数
接下来n行,每行第一个数k_i表示这个节点的儿子个数,接下来k_i个整数表示这个节点儿子的编号
[b]Output[/b]
一行一个整数,表示最多能删除多少节点。
[b]Sample Input[/b]
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
[b]题意 [/b]
[b]题解:[/b]
树上dp,每个点的权值为d[i]+e[i].size(),然后选择最小的删除就好
[b]代码:[/b]
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define test freopen("test.txt","r",stdin) #define maxn 2000001 #define mod 10007 #define eps 1e-9 int Num; char CH[20]; //const int inf=0x7fffffff; //нчоч╢С const int inf=0x3f3f3f3f; inline ll read() { ll 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*10+ch-'0';ch=getchar();} return x*f; } inline void P(int x) { Num=0;if(!x){putchar('0');puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } //************************************************************************************** int ans=0; vector<int> e[maxn]; int d[maxn],n,m; bool cmp(int x,int y) { return d[x]<d[y]; } void dfs(int x) { for(int i=0;i<e[x].size();i++) dfs(e[x][i]); sort(e[x].begin(),e[x].end(),cmp); d[x]+=e[x].size(); for(int i=0;i<e[x].size();i++) { if(d[x]+d[e[x][i]]-1<=m) { d[x]+=d[e[x][i]]-1; ans++; } else return; } } int main() { //test; n=read(),m=read(); for(int i=0;i<n;i++) d[i]=read(); for(int i=0;i<n;i++) { int num=read(); for(int j=0;j<num;j++) e[i].push_back(read()); } dfs(0); P(ans); }
相关文章推荐
- BZOJ4027 [HEOI2015]兔子与樱花 树形dp+贪心
- BZOJ 4027:[HEOI2015]兔子与樱花(贪心+树形DP)
- 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
- 【BZOJ4027】【HEOI2015】兔子与樱花(贪心+dp)
- 【bzoj4027】[HEOI2015]兔子与樱花(树上贪心)
- [bzoj4027][HEOI2015][兔子与樱花] (树形dp思想+玄学贪心)
- [bzoj4027][HEOI2015]兔子与樱花_贪心_树形dp
- 【BZOJ】【4027】【HEOI2015】兔子与樱花
- 【HEOI2015】【BZOJ4027】兔子与樱花
- BZOJ 4027 HEOI2015 兔子与樱花 树形贪心
- BZOJ4027 [HEOI2015]兔子与樱花
- 【BZOJ4027】【HEOI2015】兔子与樱花 贪心
- BZOJ 4027 [HEOI 2015] 兔子与樱花 解题报告
- 【BZOJ4027】[HEOI2015]兔子与樱花 贪心
- [BZOJ4027]HEOI2015兔子与樱花|贪心
- [BZOJ4027][HEOI2015]兔子与樱花(贪心)
- BZOJ 4027: [HEOI2015]兔子与樱花
- bzoj4027 [HEOI2015]兔子与樱花
- [BZOJ4027][HEOI2015] 兔子与樱花
- BZOJ 4027 [HEOI2015]兔子与樱花 - 贪心