题目链接
做法
将元素按权值排序,再按键值建笛卡尔树,得到的树就是原 $ Treap $ 。
树上两个点的距离等于两个点的深度之和减去它们 $ LCA $ 深度的两倍。
考虑如何计算两个点的 $ LCA $。根据笛卡尔树的性质,任意点对 $ x, y (x \leq y) $ 的 $ LCA $ 为序列 $ [x, y] $ 中的键值最大值所在点的编号。
考虑如何计算一个点的深度。一个点的深度等于从他开始的前缀/后缀键值最大值个数,可以用线段树维护(update 时间复杂度会因在线段树中二分查找前缀/后缀键值最大值个数而多一个 $ \log $ )。
时间复杂度为 $ O(n \log^2 n) $ 。
1 |
|