题目链接
题意
给出一颗有 $ n $ 个节点的树,每个点有一个初始权值 $ w_i $ ,要求支持两种操作:
- 给出 $ x $ ,$ y $ ,使点 $ x $ 的权值增加 $ y $。
- 给出 $ k $,选定 $ k $ 个点使得包含这 $ k $ 个点的最小联通子图点权和最大,你只需要输出这个最大值。
$ n, q \leq 100000, w_i, y \leq 10^9 $
做法
先不考虑修改操作,对于询问操作,当 $ k = 1 $ 时为点权最大值,可以直接 $ O(1) $ 维护。当 $ k = 2 $ 时,答案为点权最大的一条边(显然是一个叶子连向另一个叶子);当 $ k $ 更大时,相当于在已有的图上加一条未选过的从叶子上来的权值最大的链。
所以可以权值长链剖分,用动态开点线段树维护前 $ k - 1 $ 大的链。
考虑加上修改,由于点权只会增大,所以原本的修改点所在的长链依旧是长链,不是长链则可能更新成长链。可能会更新直径(要 $ makeroot $),这部分可以用 $ LCT $ 维护。
时间复杂度 $ O(n \log^2 n) $ 。
1 |
|