ssoj4000: 蔬菜(vegetable)

时间限制: 1 Sec 内存限制: 256 MB
提交: 45 解决: 14
[提交][状态][博客][加入收藏]
题目描述
题目背景:您使用脚本刷出了上题游戏 998244353 关的最高分 (最优解),心满意足的准备点继续学习,忽然一条弹窗弹了出来:你想明白活着的意义吗?你想真正的… 活着吗?YES or NO 作为一名新时代新青年,您当然不信这种扯淡的东西,毫不犹豫点击了 YES,于是当您醒来的时候,您已经在一片未知森林里了…

您正站在森林中最显眼的一棵树前,一条叫 Skqliao 的人正在树上打盹,他告诉您这棵树是一棵无根树,在第 i 个点上有 x 颗蔬菜,如果您想要回去的话就需要收集尽量多的蔬菜。当然乐于助人的 Skqliao 也会帮助您。具体来讲,首先你和 Skqliao 各选择一个不同的起点,接着轮流选定一个与自己相邻的且两人都未经过的点并到达该点。当某人无法移动时,另一人可以继续移动,直到两人都无法移动为止。当你或 Skqliao 经过某点时就可以收集该点所有蔬菜,请你制定合理策略 (包括 Skqliao 选择的初始位置和操作方式) 尝试获得最多的蔬菜。

输入
第一行一个整数
n
n,表示树的点数。

第二行有
n
n个整数,表示每个点上的蔬菜颗数
x
i
xi。

接下来
n

1
n−1行,每行两个整数
u
,
v
u,v,表示
u
u和
v
v之间有一条边。

输出
能获得的最多的蔬菜数量。

样例输入
6
10 8 6 4 2 1
1 2
1 3
2 4
2 5
2 6
样例输出
30

n<=2e5

来源
noip2018模拟-北京十一

题解:
题意就是在树上找两条互不相交的链,使它们长度和最大。发现对于两条不相交的链,一定存在一条边,将树分为各包含一条链的两部分,故可以暴力枚举每条树边,在边的两侧找到最长链,取最大值。考虑将此过程优化为O(N)的,因为要遍历每一条边,且每一条边都会将树分为两部分,故考虑次过程如何高效维护两部分的最长链。对于访问到节点u及一条边(u,v),v的子树那部分已知,考虑如何求其他部分的最长链,发现它只可能是u的子树(v的子树部分除外)、u的子树外分别的最长链或两部分的最长半链合并,若已知u子树外的信息,则可以维护,而u子树外的信息又可由它父亲的信息求得,故从根递归下去即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值