《浅谈树上邻域问题的一种基于长链剖分的解法》复读

本文内容基本为 LHF 的集训队论文《浅谈树上邻域问题的一种基于长链剖分的解法》的复读,但使用了私以为比较自然的说明顺序和说法。

离线

内邻域

长剖之后,找到询问点所在长链,把这条长链上每个点的短儿子信息合并为一条短链挂在右侧,这样,内邻域可以表示为一个矩形的信息和

内邻域
如图,其中红线表示长链,灰线表示短链,黄色表示询问矩阵。

事实上,由于询问矩阵在一个上三角矩阵的边界上,所以它可以表示为一个点 \((x,y)\) 的左下角矩阵。

然而 \((x,y)\) 可能是空的,这意味着不可能对所有的 \((x,y)\) 都预处理这个答案。

但是可以找到 \((x,y)\) 同列向下找第一个非空的 \((x,y')\),这样,该矩阵可以表示为 \([y,y')\) 行的信息和加上 \((x,y')\) 的左下角矩阵信息和,离线且信息可减时,前一部分可以简单地前缀和差分,后一部分不难预处理。这是因为整棵树内每条长链要么作为「长链」出现,要么作为其父链的「短链」,因此这样的图的总点数仍然是 \(O(n)\) 的,可以做一个类似二维前缀和的东西。

至于怎么找到这个 \(y'\) 呢?离线找是简单的,比方说可以用一个类似扫描线的东西自下而上扫,每次加入一行可以暴力地把点加入栈里做到线性。在线方法由于涉及神秘科技将在「在线」一章介绍。

内邻域.png

如图,红色矩阵表示 \([y,y')\) 行,标有⭐的点表示 \((x,y')\)

这样,我们做到了离线线性查询树上内邻域。当然上述似乎没什么用,因为这个貌似就是长剖板子。但是这个思想同样可以求外邻域,而且有办法在线求。

外邻域及邻域

首先想一想如果查询外邻域的范围完全在当前长链内会怎么样。不难发现也可以用类似的方法求解。

外邻域

因此问题在于超出当前长链范围的部分如何求解。

在信息满足可减性时,这一部分可以视为链的顶点的父亲的一个邻域信息和减去链的顶点的一个内邻域信息和,后者是简单的,假如前者的这个询问邻域长度是 \(O(\)长链长度\()\) 的,那么这个就可以在均摊线性复杂度内自上而下地递推预处理出来。

当然这个超出的邻域长度跟长链长度没什么关系,但是注意到当这个超出的长度比较长时,该询问邻域会「触底」,即覆盖了整棵子树。

假定我们当前询问的邻域为 \(x\) 的长为 \(d\) 的邻域信息,如果 \(\mathrm{fa}_x\) 的长为 \(d-1\) 的邻域仍然触底,那么两者是完全相同的。这样我们可以不断跳父亲并 \(d\gets d-1\) 直到 \(2d<\) 当前长链长度,不难发现在这之前它肯定是触底的。这样我们就把 \(d\) 限制在了 当前长链长度 \(/2\) 内,而超出的邻域长度比 \(d\) 更小。

这里跳链可以用倍增,但是会多一个 \(\log\)。有一种神奇的离线线性做法:考虑 DFS 时维护 \(n\) 个栈,表示当 \(d=i\) 的时候应该跳到哪条链上,DFS 加入一条链时,会把它加入 \(O(\)长度\()\) 个栈,所以时间复杂度是均摊线性的。

链邻域

*链邻域指的是到某条路径的距离 \(\le d\) 的点集

跳链的操作依然有效,不过既然都「触底」了可以只保留这条链的 LCA,这样就转化为了上一节的点邻域。

此时可以把答案分为 4 部分:LCA 的外邻域中超出顶点所在长链的部分、LCA 的外邻域中顶点所在长链的部分、两个端点的内邻域、以及中间的部分。

前面 3 种已然解决,对于第 4 种,依然可以使用前面介绍的方法转化为矩形信息和。

屏幕截图 2025-07-25 161228.png

不难使用类似树上前缀和的方式预处理。其实根本没有学会,待补

在线

没错,「跳链」是可以做到在线 \(O(1)\) 回答的。它可以抽象为下列的序列前驱问题:

对于序列 \(a_1,a_2,\dots,a_m\),满足 \(\sum a_i=n\)。每次给定 \(i\)\(x\),查询 \(\le i\) 的最大的 \(j\) 使得 \(a_j\ge x\)

虽然可以直接主席树,但是会多一个 \(\log\) 哦。考虑建一张 \(n\) 个点的图,每个元素 \(a_i\) 被拆成 \(a_i\) 个点,记作 \((i,j),j\in[1,a_i]\)。对每个 \((x,y)\),将其向 \((z,y+1)\) 连边,其中 \(z\)\(\le x\)\(a_z\ge y+1\) 的最大值。不难发现,这构成一个内向树森林,而查询即为 \((i,1)\)\(x-1\) 级祖先。使用在线 \(O(1)\)\(k\) 级祖先的科技即可。其实我只会 \(O(n\log n)\) 预处理的长剖方法,但是还有线性预处理的神秘技巧

还有一个「找到同一列中下面最近的存在的点」的问题,也可以转化为上面的模型,此时 \(a_i\) 是某一行最右边的点的横坐标。

至此,我们可以做到在线 \(O(n)\sim O(1)\) 的各类树上邻域问题。

posted @ 2025-07-25 18:14  justalearner  阅读(88)  评论(0)    收藏  举报