在我的题解中,我提到了“多个点的LCA=其中DFS序最大的点和其中DFS序最小的点的LCA”这一结论,但未给出证明
我翻遍全网也没找到证明,只能用DEEPSLEEP了
以下内容摘自DEEPSEEK V3
1. 定义和记号
设点集 S=v1,v2,…,vkS = {v_1, v_2, \dots, v_k}S=v1 ,v2 ,…,vk 。
记 uminu_{\text{min}}umin 为 DFS 序最小的点,umaxu_{\text{max}}umax 为 DFS 序最大的点。
记 L=LCA(S)L = \text{LCA}(S)L=LCA(S) 为点集 SSS 的最近公共祖先。
记 L′=LCA(umin,umax)L' = \text{LCA}(u_{\text{min}}, u_{\text{max}})L′=LCA(umin ,umax ) 为 DFS 序最小和最大的点的 LCA。
目标:证明 L=L′L = L'L=L′。
2. 关键观察
DFS 序的性质:在 DFS 遍历树时,对于任意两点 uuu 和 vvv,它们的 LCA 的 DFS 序一定介于 uuu 和 vvv 的 DFS 序之间(实际上,LCA 是 DFS 序区间内的最小公共祖先)。
更一般地,对于点集 SSS,其 LCA LLL 的 DFS 序一定小于等于所有点的 DFS 序(因为 LLL 是祖先),并且 LLL 是深度最大的公共祖先。
3. 证明 L′L'L′ 是 SSS 的公共祖先
L′=LCA(umin,umax)L' = \text{LCA}(u_{\text{min}}, u_{\text{max}})L′=LCA(umin ,umax ) 是 uminu_{\text{min}}umin 和 umaxu_{\text{max}}umax 的公共祖先。
由于 DFS 序的连续性,所有 DFS 序介于 uminu_{\text{min}}umin 和 umaxu_{\text{max}}umax 之间的点都在 L′L'L′ 的子树中。
因此,L′L'L′ 是 SSS 中所有点的公共祖先。
4. 证明 L′L'L′ 是深度最大的(最近的)
假设存在另一个公共祖先 L′′L''L′′,比 L′L'L′ 更深(即 L′′L''L′′ 是 L′L'L′ 的后代)。
那么 L′′L''L′′ 也必须是 uminu_{\text{min}}umin 和 umaxu_{\text{max}}umax 的公共祖先(因为 S⊆子树(L′′)S \subseteq \text{子树}(L'')S⊆子树(L′′))。
但这与 L′=LCA(umin,umax)L' = \text{LCA}(u_{\text{min}}, u_{\text{max}})L′=LCA(umin ,umax ) 是深度最大的矛盾(因为 L′′L''L′′ 更深且是公共祖先)。
因此,不存在比 L′L'L′ 更深的公共祖先,所以 L′L'L′ 就是点集 SSS 的 LCA。
5. 结论
因此,多个点的 LCA 等于其中 DFS 序最大和最小的点的 LCA。
6. 直观理解
DFS 序最小和最大的点确定了点集 SSS 在 DFS 序上的“范围”。
它们的 LCA 正好是覆盖整个范围的最小子树根节点,因此也就是所有点的 LCA。
7. 应用
该性质在处理树上的多个点查询时非常有用,因为它将多个点的 LCA 问题简化为两个点的 LCA 问题。
通常可以用 RMQ(区间最值查询)等技术高效求解。