「2023 集训队互测」举办乘凉州喵,举办乘凉州谢谢喵

一个询问 \((u,v)\),假设两个点的 \(lca\)\(c\)。考虑差分,发现答案可以拆成 \(1 → u\) 链的答案 + \(1 → v\) 的答案 - \(1 → c\) 的答案 \(\times 2\) + \(c → c\) 的答案。

单点的答案很好处理,离线下来点分治,或者写一个点分树。

因此现在只需要处理每个点到 \(1\) 的各类答案。

考虑离线处理,很明显可以重链剖分,拆成若干个重链,重链要算的是重链上所有轻儿子的答案。

发现这样会算多,就是在走轻边的时候,下面那个子树已经算过了,但又算了一遍,要减去这个子树的答案,这个可以写一个线段树合并继续离线处理。

然后最后是算从链首开始的一段树链的轻儿子的答案,这个可以离线下来 dsu 算。

然后就做完了。

posted @ 2022-11-10 08:44  Reanap  阅读(233)  评论(0编辑  收藏  举报