题目

初始有一个点 1,每次新加入点 \(2\sim n+1\),给这条边染上新的颜色,

并且一种颜色只能出现在一条路径上,使得每个点到根节点的路径上颜色种类数尽量少

每次询问输出每个点到根节点路径上颜色种类最大值

\(n\leq 10^6\)


分析

考虑到 \(x\) 只与其中一个子节点的边颜色相同,如果存在两个子节点的边颜色相同,

那么 \(x\) 到根节点就不能填这种颜色,反而不如 \(x\) 到根节点填这种颜色的颜色种类数

设 \(dp[x]\) 表示 \(x\) 的子树的结点到 \(x\) 的路径上颜色种类数的最大值。

那么选择其中一个子节点 \(dp\) 值最大的,设其为 \(fi[x]\),次大值为 \(se[x]\)

如果 \(x\) 连 \(fi[x]\) 所在的子节点,那么其它子节点的答案会加一,连其它节点 \(fi[x]+1\) 代价更大一定不优。

所以 \(dp[x]=\max\{fi[x],se[x]+1\}\),然后每次答案就是 \(fi[1]\),(\(dp[1]\) 默认有一个父亲不是真正的颜色种类)

如果还未更新,\(dp[x]=\max\{fi[x],se[x]+1\}\),那么 \(x\) 到根节点的路径也不会受影响,直接退出。

这样看似时间复杂度仍然是 \(O(n^2)\),其实不然,

考虑到一种染色就是轻重链剖分之后重链染同一种颜色,那么颜色种类数为 \(O(\log n)\)

这显然是上界,那么时间复杂度为 \(O(n\log n)\)

感觉这道题出得好妙啊,不仅用到了轻重链剖分的性质,还结合了树形dp。(dp可菜了QAQ


代码

#include <cstdio>
#include <cctype>
using namespace std;
const int N=1000011;
int n,fa[N],fi[N],se[N],dp[N];
int iut(){
int ans=0,f=1; char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans*f;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int max(int a,int b){return a>b?a:b;}
int main(){
n=iut()+1,dp[1]=1;
for (int i=2;i<=n;++i){
fa[i]=iut(),dp[i]=1;
for (int x=i;fa[x];){
if (fi[fa[x]]<dp[x]) se[fa[x]]=fi[fa[x]],fi[fa[x]]=dp[x];
else if (se[fa[x]]<dp[x]) se[fa[x]]=dp[x];
int now=max(fi[fa[x]],se[fa[x]]+1);
if (dp[fa[x]]==now) break;
dp[fa[x]]=now,x=fa[x];
}
print(fi[1]),putchar(32);
}
return 0;
}

#树形dp,树链剖分#CF442D Adam and Tree的更多相关文章

  1. [HDU 5293]Tree chain problem(树形dp+树链剖分)

    [HDU 5293]Tree chain problem(树形dp+树链剖分) 题面 在一棵树中,给出若干条链和链的权值,求选取不相交的链使得权值和最大. 分析 考虑树形dp,dp[x]表示以x为子树 ...

  2. 6.3 省选模拟赛 Decompose 动态dp 树链剖分 set

    LINK:Decompose 看起来很难 实际上也很难 考验选手的dp 树链剖分 矩阵乘法的能力. 容易列出dp方程 暴力dp 期望得分28. 对于链的情况 容易发现dp方程可以转矩阵乘法 然后利用线 ...

  3. BZOJ4712洪水——动态DP+树链剖分+线段树

    题目描述 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到 山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地爬山堵水.那么 ...

  4. [2016北京集训试题7]thr-[树形dp+树链剖分+启发式合并]

    Description Solution 神仙操作orz. 首先看数据范围,显然不可能是O(n2)的.(即绝对不是枚举那么简单的),我们考虑dp. 定义f(x,k)为以x为根的子树中与x距离为k的节点 ...

  5. 【BZOJ3522】【BZOJ4543】【POI2014】Hotel 树形DP 长链剖分 启发式合并

    题目大意 ​ 给你一棵树,求有多少个组点满足\(x\neq y,x\neq z,y\neq z,dist_{x,y}=dist_{x,z}=dist_{y,z}\) ​ \(1\leq n\leq 1 ...

  6. 5210: 最大连通子块和 动态DP 树链剖分

    国际惯例的题面:这题......最大连通子块和显然可以DP,加上修改显然就是动态DP了......考虑正常情况下怎么DP:我们令a[i]表示选择i及i的子树中的一些点,最大连通子块和;b[i]表示在i ...

  7. (中等) HDU 5293 Tree chain problem,树链剖分+树形DP。

    Problem Description   Coco has a tree, whose vertices are conveniently labeled by 1,2,…,n.There are ...

  8. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  9. 【bzoj5210】最大连通子块和 树链剖分+线段树+可删除堆维护树形动态dp

    题目描述 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块和. 其中,一棵子树的最大连通子块和指的是:该子树 ...

  10. 【bzoj4712】洪水 树链剖分+线段树维护树形动态dp

    题目描述 给出一棵树,点有点权.多次增加某个点的点权,并在某一棵子树中询问:选出若干个节点,使得每个叶子节点到根节点的路径上至少有一个节点被选择,求选出的点的点权和的最小值. 输入 输入文件第一行包含 ...

随机推荐

  1. .Net 6 WebAPI 使用JWT进行 授权认证配置

    .Net 6 WebAPI 使用JWT进行 授权认证 1.安装组件(Nuget) Microsoft.AspNetCore.Authentication.JwtBearer 2.Program.cs ...

  2. 硬件开发笔记(六): 硬件开发基本流程,制作一个USB转RS232的模块(五):创建USB封装库并关联原理图元器件

    前言   有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了一个创建USB封装,创建DIP焊盘 ...

  3. 【Python OO其二】设计模式之工厂模式(举例说明)

    工厂模式 工厂模式中的"工厂"实际上就是把类看成制造某种模板的工具(工厂),由这个类生成的实例除了本身自有的属性外,还可以通过指定的方式产出具有不同属性的同一类实例 比如:有一个面 ...

  4. 第124篇: 期约Promise基本方法

    好家伙,本篇为<JS高级程序设计>第十章"期约与异步函数"学习笔记   1.异步编程 同步行为和异步行为的对立统一是计算机科学的一个基本概念. 特别是在 JavaScr ...

  5. 【Azure Function】示例运行 python durable function(model V2)

    问题描述 参考官方文档(使用 Python 创建你的第一个持久函数:https://learn.microsoft.com/zh-cn/azure/azure-functions/durable/qu ...

  6. 【Azure Developer】使用Key Vault的过程中遇见的AAD 认证错误

    在使用应用程序访问Key Vault获取密钥信息时,现后遇见了多种认证错误.使用的代码为: String keyVaultUrl = "https://test-xxx.vault.azur ...

  7. 使用jenkins连接linux部署jar包

    jenkins安装 首先安装jenkins,我们可以使用docker安装.用下面命令拉取jenkins镜像. docker pull jenkins/jenkins 然后正常安装jenkins容器即可 ...

  8. Kali 获取任意设备信息

    注意:仅供测试 请勿商用 可获取对方位置 误差小于500m 访问摄像头 访问麦克风 一. 安装环境 #01 mac 安装虚拟机 下载地址:https://www.macyy.cn/archives/1 ...

  9. python json实例解析

    python和json   python这个语言的流行程度不用我说了,估计大家都知道吧.在字符串处理领域,json真是神一样的存在.最近一个项目中用到了,才感觉到它的威力.感觉非常有必要做一个记录和总 ...

  10. pyecharts + Django你不知道这个架构有多美

    pyecharts + Django你不知道这个架构有多美 何为echarts?   pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS ...