CF442D Adam and Tree

更好的阅读体验

题意

彩色树是边有颜色的有根树,其中每一种颜色的边集构成一条链.
定义一棵彩色树的权值为所有节点到根节点路径上不同颜色的数量的最大值.
现在有一棵不断变化的树,一开始只有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

posted @ 2022-02-02 18:13  gzezFISHER  阅读(31)  评论(0编辑  收藏  举报