写毒瘤 学套路 .
Links there:BZOJ3123
题意
有一个 $N$ 结点的森林 每一个结点有一个非负权值 初始的时候有 $M$ 条边. 有 $T$ 个操作.
请支持下面两个操作 强制在线
1 $Q$ $x$ $y$ $k$ 查询点 $x$ 到点 $y$ 上第 $k$ 小的权值 保证输入合法
2 $L$ $x$ $y$ 在 $x$ 和 $y$ 之间连边 连完边后保证还是森林.
$N,M,T \leq 80000$
思路
先对于所有出现的值离散化
对于第一个操作考虑对每个联通块开一个主席树每次新加结点就继承$father$的信息.
每次查询的时候在 $x$ $y$ $lca(x,y)$ $fa(lca(x,y))$ 上跑二分
这样的复杂度是 $O(nlog^2n)$ 的.
对于第二个操作来说 这种只有连边没有断边 用 $Link CutTree$ 可以做到 $nlogn$ 但显然给自己加大了代码复杂度 我们考虑启发式合并 记录每个联通块的 $fa$ 和 $size$ 每次连边的时候用并查集去查哪个联通快的 $size$ 更大然后暴力重新计算 $ST$ 表即可 这样的复杂度也是 $O(nlog^2n)$ 的.
总复杂度 $O(nlog^2n)$ 可以垃圾回收但没必要.
Code(人丑代码长)
1 | //What is broken can be reforged. --Riven |