题解:CF1844G Tree Weights

wangyibo201026

2024-11-18 17:25:39

Solution

solution

感觉这种 ad-hoc 构造做过类似的就能秒,没做过就死活想不出来。

首先发现无根树是很不好搞,所以我们钦定 1 为根。我们尝试将 d(i, i + 1) 描述为 dis_i + dis_{i + 1} - 2 \times dis_{lca (i, i + 1)} = d(i, i + 1)dis_i 表示 1i 的所有边边权和。

由于你已经知道了这 n - 1 个方程,有因为 dis_1 = 0,相当于你有 n - 1 个方程,n - 1 个未知数,非常朴素的想法当然是高斯消元,但是这样复杂度是 O(n^3) 的,我们需要注意到这些东西优美的性质。

移项之后,上述式子便变成了 dis_i = d(i - 1, i) - dis_{i - 1} + 2 \times dis_{lca (i - 1, i)},我们发现,只要我们知道 2 \times dis_{lca (i - 1, i)} 的值,我们可以递归求解每一项的 dis_i

这个题比较神的一个点是,设 dis_{i, j}dis_i \bmod 2^j 的值,那么则有 dis_{i, j} = ( d(i - 1, i) - dis_{i - 1, j} + 2 \times dis_{lca(i - 1, i), j - 1} ) \bmod 2^j,然后当 j 足够大时就是真实值了,此时我们简单判断一下边权和题目给出的条件是否符合条件即可。

首先考虑这样子做的正确性,因为我的 dis_{lca} 的系数是 2,那么我倍增可以恰好将 2 消掉,并且取模过程也是可以互推的(也就是说,2 \times (dis_{lca} \bmod 2^{j - 1}) = dis_{lca} \bmod 2^j,容易发现其正确性)。

一般对于这种题,有些项的系数不好描述时,尝试用取模将其消除并考虑化归到一般情况。