快乐的一天从AC开始 | 20210703 | P2633

题目链接

题目就是静态询问树上路径中第K小元素(强制在线)。

有一个非常经典的套路,就是记(g(u))表示节点(u)到根这一路径上的信息,那么(u)(v)这一条路径的信息等于(g(u) + g(v) - g(uv) - g(fuv)),其中(uv)表示(LCA(u, v))(fuv)(uv)的父节点。

根据这一点,就可以借助树链剖分和主席树(O(n log n))的解决这一道题:树链剖分用于求解LCA(也可以用倍增等算法求),在DFS的过程中,每访问到一个新节点(u),就令其为在其父节点的基础上添加(a_u)。这样可以维护每个节点到根路径上所有元素的权值线段树。

然后利用上面那个式子就可以完成查询操作。查询操作和静态区间第K大类似,相当于在权值线段树上二分,每次看往左子树走还是往右子树走即可。

原文地址:https://www.cnblogs.com/zengzk/p/14965765.html