CF1787G Colorful Tree Again

发布时间 2023-07-09 08:20:46作者: jimmyywang

这个故事告诉我们:不要转化完题意以后抛开原问题的特殊性质,要不然你会得到一个不可做的原题加强版。

首先抠出所有好链,并时刻注意原图是一棵树

为了利用好树的性质,我们定一个根,使得每个点有唯一父亲。

然后把所有链挂在这条链的 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)\) 的链 的 lcamultiset,把这条链删除。

可以记录一个 \(del_i\) 表示一条链除了 lca 外被摧毁了几个点 来辅助判定。

修复点的操作类似。