s弄成前缀和(到根), dp(i) = min(dp(j) + (s(i)-s(j))*p(i)+q(i)). 链的情况大家都会做...就是用栈维护个下凸包, 插入时暴力弹栈, 查询时就在凸包上二分/三分. 扩展到树上的话, 就先树链剖分, 然后就变成链上的情况了, 线段树每个结点处理出对应的区间的凸包. 对于x, 用Root到fa[x]这段路径来更新x. 我们知道1段路径会剖成 ≤ log N 段, 然后每段(区间)只会影响log N个线段树结点, 加上每次O(log N)三分/二分, 时间复…