CF1824C

原题

翻译

首先考虑一个朴素的 dp ,我们设dpi,j表示以i为根的子树全部变成bj最少要进行多少操作,容易得到转移

最终复杂度O(n2),是不足以通过的


我们发现dp的第二维状态很浪费,因为我们发现我们并不在乎染成每个颜色时的状态,而只在乎值最小的dpv能染成颜色的集合

那我们不妨直接找出这些集合,即设dpu表示以u为根的子树内所有叶子染成相同颜色需要的最少操作次数,Mu表示以u点为根的子树内使叶子颜色相同的最少操作次数的能染成颜色的集合(简单的说就是把以u节点为根的子树叶子变成相同颜色且操作次数为dpu的可以染成的颜色的集合),注意Mu为可重集

于是我们考虑怎么递推,Mu=(u,v)EMv,我们找到出现次数最多的颜色,这里不妨设它的出现次数为k,则fu=(u,v)Efv+1k

但是还没有结束,我们可以发现Mu的定义和我们把Mv并上来得到的Mu定义不同,因为合并后的Mu考虑了所有可能成为答案的方案,但我们只想要所有是答案的方案,所以我们要遍历一遍集合Mu,如果里面的元素出现个数=k,则我们把它的值赋值成1,否则变成0

然后用setmap维护集合,最终只需要使用dsu on tree即可做到O(nlog2n)

如果实现的好的话可以把叶子的权值离散化一下,可以消掉map的一个log,最终可做到O(nlogn)

此题的关键在于发现第二维状态没什么用

zmy直接一眼秒了,wssb

posted @   FOX_konata  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示