BZOJ4027 [HEOI2015]兔子与樱花 树形dp+贪心

删掉一个结点的代价是c[i]+son[i]
树形dp+贪心,每个结点显然选代价最小的儿子
每个结点把儿子排序一下
复杂度nlogn,虽然n<=2e6,但常数很小

一开始想到了 但是没敢写。。看了题解发现nlogn能过...

#include<bits/stdc++.h>
#define LL long long
#define clr(x,i) memset(x,i,sizeof(x))
using namespace std;
const int N=2000005;
inline void read(int &x)
{
	x=0;char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
}
vector<int> G[N];
int n,m,c[N],ans;
bool cmp(int a,int b)
{
	return c[a]<c[b];
}
void dfs(int u)
{
	for(int i=0;i<G[u].size();i++)
	  dfs(G[u][i]);
	sort(G[u].begin(),G[u].end(),cmp);
	c[u]+=G[u].size();//
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(c[u]+c[v]-1<=m){
			ans++;c[u]+=c[v]-1;
		}
		else break;
	}
}
int main()
{
	read(n);read(m);
	for(int i=0;i<n;i++)read(c[i]);
	for(int i=0;i<n;i++){
		int x,v;read(x);
		while(x--){
			read(v);
			G[i].push_back(v);
		}
	}
	dfs(0);
	printf("%d",ans);
	return 0;
}


发布了39 篇原创文章 · 获赞 4 · 访问量 5819

猜你喜欢

转载自blog.csdn.net/Wolf_Reiser/article/details/78573751