P5521 题解

一道比较不错的思维题。

对于树上的每一个节点,我们考虑设节点 i 要放 wi 朵梅花,如果从梅岭带出 ansi 朵梅花,就在节点 i 上放 wi 朵梅花。

具体地,有以下两种情况:

第一种情况,梅花直接放所有子节点再放父节点。则易知 wi+wj

第二种情况,如果已经在节点 j 放了梅花,显然都会将其子节点的梅花收走。那么放一个子节点的花费为:

j=1k1wi+ansk

因为要放所有子节点,所以取其最大值。则有:

ansi=max{wi+wj,maxk=1n{j=1k1wj+ansk}}

注意到 ansi 与子节点顺序有联系,那么就需要排序。

这里给出结论:直接按 ansiwi 从大到小排序。

证明:

设两个节点 ij 相邻,且交换前的值是 max{ansj+wi,ansi},交换后的值是 max{ansi+wj,ansj}

若满足条件 ansiwi>ansjwj,则有 ansj+wi<ansi+wj

因为 wN+,所以有:

{ansj+wi>ansjansi+wj>ansiansj+wi>ansi

显然原顺序优于交换顺序。

证毕。

至于时间复杂度的话,设树上每一个节点与 m 个节点相邻,则总的时间复杂度为 O(nmlogn),可以通过本题(或许可以钦定为 O(n)?)。

#include <iostream>
#include <algorithm>
#include <vector>
#define MAXN 100005
using namespace std;
int n, p;
struct edge{int w, to, nxt;}e[MAXN << 1];
int head[MAXN], cnt = 1;
struct node{
	int ans, w;
	bool friend operator<(node a, node b){
		return a.ans - a.w > b.ans - b.w;
	};
}a[MAXN];
int read(){
	int t = 1, x = 0;char ch = getchar();
	while(!isdigit(ch)){if(ch == '-')t = -1;ch = getchar();}
	while(isdigit(ch)){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
	return x * t;
}
void write(int x){
	if(x < 0){putchar('-');x = -x;}
	if(x >= 10)write(x / 10);
	putchar(x % 10 ^ 48);
}
void add(int u, int v, int w){
	cnt++;e[cnt].to = v;e[cnt].nxt = head[u];head[u] = cnt;
}
void dfs(int now){
	vector <node> tmp;tmp.clear();a[now].ans = a[now].w;
	for(int i = head[now] ; i != 0 ; i = e[i].nxt){
		int v = e[i].to;dfs(v);
		tmp.push_back(a[v]);
		a[now].ans += a[v].w;
	}
	sort(tmp.begin(), tmp.end());int tot = 0;
	for(int i = 0 ; i < tmp.size() ; i ++){
		a[now].ans = max(a[now].ans, tmp[i].ans + tot);
		tot += tmp[i].w;
	}
}
int main(){
	n = read();
	for(int i = 2 ; i <= n ; i ++)p = read(),add(p, i, 0);
	for(int i = 1 ; i <= n ; i ++)a[i].w = read();
	dfs(1);
	for(int i = 1 ; i <= n ; i ++){
		if(i != 1)putchar(' ');
		write(a[i].ans);
	}
 	putchar('\n');return 0;
}
posted @   tsqtsqtsq  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示