[TJOI2015]旅游
问题描述
为了提高智商,ZJY准备去往一个新世界去旅游。这个世界的城市布局像一棵树。每两座城市之间只有一条路径可以互达。每座城市都有一种宝石,有一定的价格。ZJY为了赚取最高利益,她会选择从A城市买入再转手卖到B城市。由于ZJY买宝石时经常卖萌,因而凡是ZJY路过的城市,这座城市的宝石价格会上涨。让我们来算算ZJY旅游完之后能够赚取的最大利润。(如a城市宝石价格为v,则ZJY出售价格也为v)
输入格式
第一行输入一个正整数N,表示城市个数。
接下来一行输入N个正整数表示每座城市宝石的最初价格p,每个宝石的初始价格不超过100。
第三行开始连续输入N-1行,每行有两个数字x和y。表示x城市和y城市有一条路径。城市编号从1开始。
下一行输入一个整数Q,表示询问次数。
接下来Q行,每行输入三个正整数a,b,v,表示ZJY从a旅游到b,城市宝石上涨v。
即是询问a—>b(有方向)间路径上的max(Price[j]−Price[i])) 且j到a的距离比i到a大 。然后把这条路径上所有点的点权+v。
1≤ N≤50000, 1≤Q ≤50000
输出格式
对于每次询问,输出ZJY可能获得的最大利润,如果亏本则输出0。
样例输入
3
1 2 3
1 2
2 3
2
1 2 100
1 3 100
样例输出
1
1
显然的树链剖分,主要处理询问。
考虑用线段树维护,线段树上记录$Max,Min,Lans,Rans$,其中$Lans=max(Max[ls]-Min[rs],Lans[ls],Lans[rs])$。
$Rans$同理,然后每次查询可以用一个结构体来保存结果,将询问拆到线段树整区间上再向上合并即可。
最后求结果的时候,先找出$a,b$的$lca$,然后答案就是$a\rightarrow lca$的$Lans$,$lca\rightarrow b$的$Rans$,$lca\rightarrow b$的$Max$减去$a\rightarrow lca$的$Min$三者的最大值。
代码:
1 |
|