Codeforces Round #463 F. Escape Through Leaf (李超线段树合并)
听说正解是啥 set启发式合并+维护凸包+二分 根本不会啊 , 只会 李超线段树合并 啦 ... 题意 给你一颗有 $n$ 个点的树 , 每个节点有两个权值 $a_i, b_i$ . 从 $u$ 跳到 $v$ 的代价是 $a_u \times b_v$ . 你需要计算每个节点跳到叶子的最小代价 . $(n \le 10^5, -10^5 \le a_i, b_i \le 10^5)$ 题解 我们首先考虑一个很容易的 $dp$ , 令 $dp_i$ 为 $i$ 跳到叶子的最小代价 . 那么显然有一个转移 此处 $v$ 是 $u$ 的后代 . $$\displaystyle dp_u = \min_v {a[u] \times b[v] + dp_v}$$ 暴力转移是 $O(n^2)$ 的显然无法接受 . 那么考虑优化 , 不难发现这个转移就是 李超线段树上求多条直线 $y=kx+b$ 在 $x=k$ 最值的形式 . $(k = b[v], x = a[u], b=dp_v)$ 那么显然可以考虑用李超线段树维护这个 $dp$ . 对于树上的每个点 , 可以用一颗李超线段树维护这个点子树的所有直线信息 . 然后我们只需要考虑合并几颗子树信息了 , 不难发现是 套路的 线段树合并 . (这样时间空间复杂度都正确了?) 我们直接同时遍历两颗线段树 ,