「2023 集训队互测」举办乘凉州喵,举办乘凉州谢谢喵
一个询问 (u,v),假设两个点的 lca 是 c。考虑差分,发现答案可以拆成 1→u 链的答案 + 1→v 的答案 - 1→c 的答案 ×2 + c→c 的答案。
单点的答案很好处理,离线下来点分治,或者写一个点分树。
因此现在只需要处理每个点到 1 的各类答案。
考虑离线处理,很明显可以重链剖分,拆成若干个重链,重链要算的是重链上所有轻儿子的答案。
发现这样会算多,就是在走轻边的时候,下面那个子树已经算过了,但又算了一遍,要减去这个子树的答案,这个可以写一个线段树合并继续离线处理。
然后最后是算从链首开始的一段树链的轻儿子的答案,这个可以离线下来 dsu 算。
然后就做完了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步