李超树学习笔记

李超线段树

李超线段树一般的操作是加入一个线段求在某个点处的极值。

李超线段树每个节点有一个优势线段,表示在 \(mid\) 处取到最优的线段,相当于是标记永久化,如果不是优势线段,那么其最多在 \(l,r\) 中的一个位置比当前线段最优,因此最多递归进入一个孩子,于是复杂度是 \(O(\log n)\) 的。

CF932F Escape Through Leaf

题意:一棵树,每个点有点权\(a_i,b_i\),从\(x\)到子树中点\(y\)的代价是\(a_x\times b_y\),求每个点到树的叶子节点的代价的最小值。

思路:第一次知道有李超树合并。设\(f_x\)表示\(x\)到叶子节点的代价的最小值,则有\(f_x=\min\limits_{x\in anc_y}f_y+a_x\times b_y\),发现这相当于是有若干一次函数,要求当\(x=a_x\)时的最小值,于是考虑李超树。而一个点有多个子树是,需要将每个儿子的李超树合并起来,这一步的复杂度均摊是\(O(n\log n)\)的,于是就做完了。

P2305 [NOI2014] 购票

题意:一棵树,有边权,两点的路径长度为边权之和,点 \(x\) 可以到距离不超过 \(l_x\) 的点 \(y\),代价是 \(p_xdis(x,y)+q_x\),求每个点到 1 号点的最小代价。

其实还好,就是相当于维护一个区间李超树,可以根据出栈序,建立线段树套李超树就可以了。

P4655 [CEOI2017] Building Bridges

题意:有 \(n\) 个柱子依次排列,要修建一些桥,如果在 \(i,j\) 之间建桥代价是 \((h_i-h_j)^2\),同时如果一根柱子不与桥相连就需要 \(w_i\) 的代价,求把第一根柱子和最后一根柱子连通的最小代价。

思路:考虑 DP,设 \(f_i\) 表示连通 \(i\) 的最小代价,有 \(f_i=\min\limits_{j}(f_j+(h_i-h_j)^2+\sum\limits_{k\in(j,i)}w_k)\),记 \(w\) 的前缀和是 \(pre\),那么有 \(f_i=\min\limits_{j}(f_j+h_j^2-pre_j-2h_ih_j)+h_i^2+pre_{i-1}\),于是就可以用李超树来维护最小值了。

posted @ 2024-02-13 11:53  Xttttr  阅读(26)  评论(0编辑  收藏  举报