【Luogu P4577】「FJOI2018」领导集团问题

Luogu P4577

Description

给出一棵大小为 n 的树,第 i 个节点的权值为 wi

你需要选出一个最大的节点集合,使得对于节点集合中不同的两个点 i,j,若 ij 的祖先节点,必须满足 wiwj

数据范围:1n2×1051wi109
时空限制:1000 ms/250 MiB

Solution

提供一种类似 [NOI2020] 命运 的整体 dp 做法。

考虑 dp。记 f(u,i) 表示:在子树 u 中选出的节点集合的 w 最小值为 i 的情况下,最大的节点集合的大小。有两种转移:

  • 节点集合不包括 u(要保证 f(u,i) 至少有一个 f(v,i) 的转移)。

f(u,i)vson(u)max{f(v,i)}

  • 节点集合包括 u

f(u,wu)1+vson(u)max{f(v,wu)}

考虑线段树合并优化,在一棵维护子树 u 的线段树中,代表区间 [l,r] 的节点需要维护在子树 u 中选出的节点集合的 w 最小值在区间 [l,r] 中的情况下,最大的节点集合的大小,即 maxlirf(u,i)

转移 1 即为整体 dp 的重点,在线段树合并的过程中计算。具体地,在合并线段树 p, q 的过程中,设当前合并到了代表区间 [l, r] 的节点,在递归的过程中记录 maxi>r{f(u,i)}maxi>r{f(v,i)} 并分别记作 maxp, maxq。将情况分成以下五类讨论:

  • p=0,q=0 时:返回空节点 0 即可。
  • p0,q=0 时:此时相当于对 p 内做一次区间加 maxq,打上懒标记后返回 p 即可。
  • p=0,q0 时:此时相当于对 q 内做一次区间加 maxp,打上懒标记后返回 q 即可。
  • l=r 时:此时递归到了一个叶子节点,有 f(u,l)=max(maxp,f(u,l))+max(maxq,f(v,l))
  • p0,q0 时:此时需要先合并 p,q 的左右儿子,再以通过左右儿子上传信息。

特别要注意的是,区间加不用也不能对空节点打标记,因为空节点不能保证 f(u,i) 至少有一个 f(v,i) 的转移。

转移 2 即为平凡的区间查询最大值,单点修改。

时间复杂度 O(nlogw),空间复杂度 O(nlogw)

posted @   Calculatelove  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
点击右上角即可分享
微信分享提示