题目描述 Description
水果姐第二天心情也很不错,又来逛水果街。突然,cgh又出现了。cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径)。同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样。cgh给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店 (可以是同一家店,但不能往回走)卖出去。求最多可以赚多少钱。水果姐向学过oi的你求助。
输入描述 Input Description
第一行n,表示有n家店下来n个正整数,表示每家店一个苹果的价格。下来n−1行,每行两个整数x,y,表示第x家店和第y家店有一条边。下来一个整数m,表示下来有m个询问。下来有m行,每行两个整数x和y,表示从第x家店出发到第y家店。
输出描述 Output Description
有 m 行。每行对应一个询问,一个整数,表示面对cgh的每次询问,水果姐最多可以赚到多少钱。
样例输入 Sample Input
1 | 10 |
样例输出 Sample Output7
1 | 11 |
数据范围及提示 Data Size & Hint
0<=苹果的价格<=108
0<n<=200000
0<m<=10000
题解
这道题简直有毒.
因为不能往回走,所以单纯的维护max和min 是不够的.
还需要维护两个ans,一个是从这个节点往根节点走的 ans,另一个是从根节点往这个节点走的ans .
在更新ans的时候,有多种情况
- 某一部分的ans
- 如果是从 x−>lca(x,y) 的 ans , 可以下面部分取 min ,上面部分取max进行更新
- 如果是从lca(x,y)−>y 的 ans ,可以在下面部分取 max, 上面部分取 min 进行更新
- 然后可以x−>lca(x,y) 取 min ,lca(x,y)−>y 取 max 进行更新
- 然后不要忘记用他们的最近公共祖先更新 min 和 max
嗯表述很奇怪,具体看代码,代码还是很好懂的
1 |
|