JZOJ1230. Road (2017.8B组)

来源:互联网 发布:java timestamp long 编辑:程序博客网 时间:2024/06/07 04:56

Description

Z 国是一个拥有N 个岛的国家。这N 个岛用N-1 条桥来连接,且任意两个岛之间都可以互达。
某商人听说Z 国是一个很富有的国家,所以他想到Z 国闯一闯。经过他仔细的观察,他发现某样商品特别受欢迎,而且由于各岛之间沟通联系不够多,所以这样物品在每个岛的价格可能都不同。
Task:商人开始在编号为x 的岛上,然后他要走到编号为y 的岛上。在这期间,他可以在x 岛y 的路径上买一件商品,和卖一件商品。,注意,仅能买一件和卖一件!显然你要计算商人从岛x 到岛y 最多能赚多少钱。

Input

输入第一行有一个整数N(1≤n≤50000),表示Z 国有N 个岛。
接下来有N 行,每行一个整数Ci(1≤Ci≤50000),第N+i 行的Ci 表示商品在岛i 的价
格。
再接下来有N-1 行,每行两个整数x,y(1≤x,y≤50000),表示岛x 和岛y 之间有一条
桥。
接下来有一个整数M,表示有M 个询问。
然后M 行,每行两个整数,x,y(1≤x,y≤50000),表示询问你,商人从岛x 到岛y 最多
能赚多少钱?

Output

对于每次询问,如果商人能赚到钱,则输出最多能赚多少钱。
如果不能赚钱,就输出0(你可以这样理解——亏本生意谁都不会做^_^)

Sample Input

4
1
2
3
4
1 2
1 4
2 3
3
1 3
3 1
1 4

Sample Output

2
0
3
想法:
先用dfs求出每个点的深度,每个点的父亲
然后对于询问的x,y,求出它们的lca,然后把x–lca–y构成一个序列
贪心
如果最小值更新,最大值清空(大的值要在小的后面),如果最大值更新,用当前最大值-最小值更新答案
可以打倍增