「2023 集训队互测」举办乘凉州喵,举办乘凉州谢谢喵
一个询问 \((u,v)\),假设两个点的 \(lca\) 是 \(c\)。考虑差分,发现答案可以拆成 \(1 → u\) 链的答案 + \(1 → v\) 的答案 - \(1 → c\) 的答案 \(\times 2\) + \(c → c\) 的答案。
单点的答案很好处理,离线下来点分治,或者写一个点分树。
因此现在只需要处理每个点到 \(1\) 的各类答案。
考虑离线处理,很明显可以重链剖分,拆成若干个重链,重链要算的是重链上所有轻儿子的答案。
发现这样会算多,就是在走轻边的时候,下面那个子树已经算过了,但又算了一遍,要减去这个子树的答案,这个可以写一个线段树合并继续离线处理。
然后最后是算从链首开始的一段树链的轻儿子的答案,这个可以离线下来 dsu 算。
然后就做完了。