1 条题解
-
0
1. 题意理解
我们有一棵有根树(领导树),每个节点 有一个级别 ,越高层的领导 越小。
定义一个部门结点子集 ,满足:
对任意 ,如果 是 的子孙,则 。
换句话说:在祖先-后代关系中,祖先的级别必须小于等于后代的级别(因为 越小表示越高层的领导,所以祖先的 小,后代的 大或相等)。
2. 条件转化
设 是 的祖先,那么条件要求: [ w_a \le w_d ] 即从根到叶子的路径上, 必须非递减。
所以我们要找树中一个最大的节点子集,使得任意根到该子集中某个叶子的路径上 非递减。
3. 问题重述
在树中找一个最大的节点集合 ,使得:
- 如果 是 的祖先且 ,那么 。
这等价于:在任意一条从根向下的路径上,如果选了多个节点,这些节点的 必须非递减。
4. 思考解法
这是一个树上的最长非递减链类问题,但不同链可以共享节点吗?
注意:集合 不要求连通,但必须满足祖先-后代的 非递减条件。所以我们可以这样想:
- 对每个节点 ,考虑以 为最高层( 最小)的、包含 的满足条件的最大集合大小。
- 但这样不好做,因为节点可能同时属于多个链。
5. 关键观察
设 表示在 的子树中,选择 且满足条件的最大节点数。
如果选择 ,那么 的所有子孙如果要被选,必须满足 。
所以我们可以递归地:
- 先把所有 的子孙排除(如果选 ,这些子孙不能选,因为 比 小,违反非递减)。
- 然后对满足 的子孙,可以独立地选择它们的最大满足条件的集合。
但这样直接做是 的,不可行。
6. 优化思路
考虑自底向上 DP,并利用数据结构合并子树信息。
定义 表示在 的子树中,所有被选节点的 值 的最大节点数(不一定选 自己,但这里我们考虑包含 的情况)。
另一种更好定义的方式:
设 表示在 的子树中,所选节点必须满足 的最大节点数。
那么: [ g(u, \text{minW}) = \max\left( g(u, \text{minW}), \sum_{v \in \text{children}(u)} g(v, \text{minW}) \right) ] 如果选 ,则要求 ,并且新的 变成 : [ g(u, \text{minW}) = \max\left( g(u, \text{minW}), 1 + \sum_{v \in \text{children}(u)} g(v, w_u) \right) ]
这样我们可以用线段树或平衡树(map)来维护每个节点 函数,合并时用启发式合并(小的合并到大的)。
7. 具体算法
- 自底向上处理树。
- 每个节点 维护一个
map<int, int>:f[w]表示在 子树中,所选节点最小 值至少为 时的最大节点数。 - 初始时,
f[w_u] = 1。 - 对每个子节点 :
- 如果 的
f比 的f小,则交换(启发式合并)。 - 把 的
f合并到 的f中:
对每个 在 的f中,更新
u_f[ minW ] = max(u_f[minW], val)。
- 如果 的
- 然后考虑选 自己:
找到 的f中所有 的项,取最大值 ,
然后u_f[ w_u ] = max(u_f[w_u], M+1)。 - 最后,根节点的
f中的最大值就是答案。
8. 复杂度分析
启发式合并的复杂度是 ,因为每次合并是 ,并且每个节点最多被合并 次。
9. 样例验证
样例:
6 2 5 1 3 5 4 1 1 2 2 4树结构:
1(w=2) ├── 2(w=5) │ ├── 4(w=3) │ └── 5(w=5) └── 3(w=1) └── 6(w=4)我们手动找最大集合:
可以选 {1, 2, 5, 6}(1→2: 2≤5, 1→6: 2≤4, 2→5: 5≤5),大小 4。
输出 4,符合。
10. 总结
本题是树形 DP 结合启发式合并的经典题,关键在于定义状态为
g(u, minW)表示在 子树中,所选节点 值至少为minW的最大节点数,并用 map 维护,通过启发式合并得到 的解法。
- 1
信息
- ID
- 4950
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者