给定一棵 n 个节点的树,每个节点有一个商品的价格,可以进入买入或者卖出。
有 m 个询问,询问从一个节点到另一个节点,可以在路途中买入和卖出一次,求最大收益。输入数据均不小于5e4。
找到这个版本带修的题P3976 [TJOI2015] 旅游,不过做法只会树剖套线段树不会LCT,所以干脆讲回原题。
法一
常规做法,树剖套线段树。
注意买入的点早于卖出的点,假设原树退化成链的情况,考虑分治,维护左右区间的答案/最小值/最大值,合并区间时把左区间走向右区间 和 右区间走向左区间的答案都记录上,最大最小值简单合并不用阐述。
还原回一棵树,询问仍然是一段链,自然地想到套个树剖即可,整个过程很流畅。
法二
LCA倍增。
说实话一开始真没想到,看了标签才顿悟。想到这个想法本质是因为不带修,很像RMQ,但是这个做法的推理过程不太好想,如果开始还将原题先退化成链,即使想到RMQ,由于原树编号不连续,也就不敢往上套。不过这道题给了启迪,树不带修的题很大可能与LCA倍增的做法有关系。
做法也很显然,除了既要维护 f u , i f_{u,i} fu,i 还要维护 m x u , i , m n u , i , [ l − > r ] u , i , [ r − > l ] u , i mx_{u,i},mn_{u,i},[l->r]_{u,i},[r->l]_{u,i} mxu,i,mnu,i,[l−>r]u,i,[r−>l]u,i外,其他和正常的倍增求LCA基本保持一致。
目的就是,把树的题一道道吃透吧。