这个故事告诉我们:不要转化完题意以后抛开原问题的特殊性质,要不然你会得到一个不可做的原题加强版。
首先抠出所有好链,并时刻注意原图是一棵树。
为了利用好树的性质,我们定一个根,使得每个点有唯一父亲。
然后把所有链挂在这条链的 lca
上。
考虑摧毁一个节点的影响。
把一个点 \(u\) 摧毁,会影响两种链:挂在 \(u\) 上(即 lca
为 \(u\))的链、经过 \((u,fa_u)\) 的链。
注意到路径互不相交(也可以说是一种合法颜色的链只有一条),那么经过 \((u,fa_u)\) 的链最多只有 1 条。
我们对每个点 \(u\) 开一个 multiset
,记录 lca
为挂在 \(u\) 上的链中,除 \(u\) 点外完整的链的权值集合。再开一个记录答案的 multiset
,存每个点的贡献。
那么摧毁 \(u\) 时,对于第一种边,点 \(u\) 的 multiset
对最终答案的贡献会变成 \(0\);对于第二种边,只要单独修改 经过 \((u,fa_u)\) 的链 的 lca
的 multiset
,把这条链删除。
可以记录一个 \(del_i\) 表示一条链除了 lca
外被摧毁了几个点 来辅助判定。
修复点的操作类似。