题解:P3714 [BJOI2017] 树的难题

link

要处理所有的简单路径,因而考虑淀粉质点分治。设当前的分治中心为 \(r\),我们显然可以简单 DFS 出所有以 \(r\) 为端点的路径的权值,这样只需要在 \(r\) 处拼接两条路径即可算出答案。

由于同一个颜色连续段只贡献一次权值,因而我们考虑把 \(r\) 的邻边中颜色相同的放在一起处理。开两棵以路径长度为下标的线段树,分别存储已经处理过的颜色和当前正在处理的颜色。处理每条邻边时,先计算经过这条边的链和已经有的链相连的贡献,处理完当前儿子后将其加入第二棵线段树。将一种颜色处理完后,将这种颜色的所有链加入第一棵线段树并清空第二棵线段树即可。时间复杂度为 \(O(n\log_2^2n)\)

清空第二棵线段树时,要用遍历所有链来清空,我清空前 \(4\) 倍的最长链长度会 TLE 一个点,比较玄学。

另外我最开始忘了继续分治了,只分治了一次,居然在锣鼓获得了 \(60\) 分,比较逆天。

posted @ 2025-02-19 17:32  FugiPig  阅读(27)  评论(0)    收藏  举报