题解 [BZOJ3307] P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并
传送门
题意
一棵 $n$ 个结点的树,有 $m$ 次操作。
每次操作可以使 $u$ 到 $v$ 的简单路径上的所有点增加一个 $z$ 类型的物品。
查询每个结点最多物品的物品编号。
分析
对于每次操作,我们要更新从 $u$ 到 $v$ 的直接路径,很容易想到,我们可以用树上差分来解决更新。
我们将一个查询分为两个链,将其上的点的父亲标记该颜色 -1,其下的点标记颜色 +1。
由于我们要输出每个树结点的答案,又使我们想到了我们的树上启发式合并 DSU。
但是问题又有了,我们该如何在增加后查询我们的答案呢?
肯定不能直接用 $cnt$ 记录,由于我们增加过程中会有 -1 的操作,我们的答案可能并不是正确的,这又是一个问题,我们应当如何呢?
再分析我们的要求:可以做到单点修改增加或减小,可以维护区间的最值与其 $id$ ,这让我们又想到我们亲切的线段树。
整个过程已经结束,接下来还有几个要点。
- 我们的答案可能存在是 0,于是我们可以将下标右移,这样我们就可以完成 0 的答案。
- 我们的 $z$ 可能很大,我们还需要离散化。
总结起来,我们要完成的操作有:
- DSU
- 倍增查询 LCA
- 一个简单的维护最值线段树
- 离散化
那就让我们以 $O(n\log^2 n)$ 的时间复杂度愉快的 AC 掉这道紫题吧。

浙公网安备 33010602011771号