考虑令 \(f(i)=\text{dist}(u_i,v_i)-2w_i\),那么一种方案 \((u_i,v_i,w_i)\) 和 \((u_j,v_j,w_j)\) 的贡献(钦定相交部分一边都是 \(u\),一边都是 \(v\))的两倍就是 \(f(i)+f(j)+\text{dist}(u_i,u_j)+\text{dist}(v_i,v_j)\)。枚举 \(t=\text{LCA}(u_i,u_j)\),那么即是:
考虑在 \(v_i\) 处插入一个权值为 \(f(i)+d_{u_i}\) 的物品,那么枚举 \(t\),就是求在 \(t\) 处合法的物品对的带权距离最大值。这个信息是可以线段树合并的(具体方法就是记录当前集合的最大答案点对,合并时从两个集合中选出总共两个数算贡献,要用到 \(\mathcal O(1)\) 求 LCA)。我们考虑什么样的物品对是在 \(t\) 处合法的。显然 \(u_i\) 要在 \(t\) 的子树内,并且 \(\text{LCA}(u_i,v_i)\) 是 \(t\) 的祖先。并且 \(u_i\) 和 \(u_j\) 处于 \(t\) 的不同子树(\(t\) 自己单独算一棵子树)内。容易发现在 \(u_i\) 处插入物品,在 \(\text{LCA}(u_i,v_i)\) 之前删除物品,这样做线段树合并即可。具体实现时有可能把 \(v\) 当作 \(u\) 来看,我们只需要对于 \(v\) 做对称的插入和删除就可以了。单组时间复杂度是 \(\mathcal O((n+m)(\log n+\log m))\) 的。但是特别卡常。