先推一下我的全文站内跳转
对于“紧急集合”这道题目,核心问题是在一棵树(n个节点,n-1条边,连通无环)上,处理多次查询(m次)。每次查询给定三个节点x、y、z,需要找到一个集结点p,使得从x、y、z到p的总距离(即路径长度之和)最小,并输出p和最小总距离c。
对于三个点x、y、z,最优集结点p是它们两两LCA(LCA(x,y)、LCA(y,z)、LCA(z,x))中深度最大的那个。这是因为深度最大的LCA位于三个点路径的交汇处,能最小化总距离。
最小总距离c可以通过三个两两点对的距离之和除以2得到,即: [ c = \frac{2 \times \text{dist}(x,y) + \text{dist}(y,z) + \text{dist}(z,x)}{2} ] 其中,(\text{dist}(a,b)) 是节点a和b之间的距离,计算公式为: [ \text{dist}(a,b) = \text{depth}[a] + \text{depth}[b] - 2 \times \text{depth}[\text{LCA}(a,b)] ] 这里,(\text{depth}[u]) 表示节点u的深度(以固定根节点为基准)。
由于n和m最大可达5×10⁵,直接遍历树计算LCA会超时。需要使用倍增法预处理树,实现O(log n)时间复杂度的LCA查询。倍增法通过预计算节点的2^k级祖先表,加速LCA查询。
看到这里应该思路都有了吧!祝你AC