CF442D Adam and Tree

"本文讨论了一种彩色树问题的动态优化方法,如何在不断变化的树中快速计算权值。通过引入状态转移方程和策略,将复杂度从(O(n^2))降低到(O(nlog n)),并提供了详细的证明和代码实现。关键概念包括链结构、最优方案和动态规划。"
摘要由CSDN通过智能技术生成

更好的阅读体验

题意

彩色树是边有颜色的有根树,其中每一种颜色的边集构成一条链.
定义一棵彩色树的权值为所有节点到根节点路径上不同颜色的数量的最大值.
现在有一棵不断变化的树,一开始只有1号点 (根节点),接下来每个时刻长出一个新点,求每一时刻树的权值

长出的节点数 \(n\le10^5\)

题解

先考虑树静止时怎么做

发现必然存在一种最优方案,其中任意一种颜色的边集构成的链都是以一个点与其祖先为顶点的链,证明是所有其他的最优方案都可以转化为这种方案

\(val_u\) 表示点 \(u\) 的子树与 \(u\) 到父亲的边构成的树的最小权值,显然可以从 \(val_v,v\in\text{son}_u\) 转移
我们找出 \(val_v\) 最大的 \(v\) 记为 \(maxv_u\),让 \(u\) 到其父亲的边继承边 \((u, maxv_u)\) 的颜色,显然这样是最优的

\[val_u=\max\{\max_{v\in\text{son}_u,v\not=maxv_u}val_v+1, val_{maxv_u}\} \]

我们记下 \(val_v\) 的最大值 \(max_u\),非严格次大值 \(secmax_u\)
于是有

\[val_u=\max\{max_u, secmax_u+1\} \]

DP即可,注意答案为 \(max_1\)

每次加点,我们从新加的点不断向上更新,这样的时间复杂度是 \(\mathcal{O}(n^2)\),不足以通过此题

考虑做一点小优化
我们在向上跳的过程中,如果已经无法更新 \(val\),那么再往上跳也无法更新
如果已经无法更新 \(val\),停下即可

下面证明这样做复杂度是 \(\mathcal{O}(n\log n)\)

时间复杂度即为更新 \(val\) 的次数,即 \(T(n)=\sum\limits_{1\le i\le n}val_i\)\(val_i\) 的上界是 \(\log_2 n\)
我们通过构造来证明,实际上并不需要我们自己构造,因为树链剖分已经帮我们构造好了

代码 codeforces submission 144894116

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值