NOIP2025 个人题解 - LCA
CommonAnts · · 算法·理论
NOIP2025 个人题解
作者:LCA 蔡德仁 CommonAnts
特别感谢助教 @_ 协助验证细节,写暴力等。
评
总体难度:
- T1 黄/绿
- T2 上位蓝/下位紫
- T3 黑
- T4 上位紫/下位黑
分项:
- T4 原题度偏高,
q=1 情况是 LOJ6490 - T3 需要一点注意力
- T2 T3 相对 NOIP 来说比较多数学细节硬推导,尤其是 T3
- T2 T3 T4 算法细节相对 NOIP 来说都比较多
- T4 相对 NOIP 来说代码细节比较多
T1 糖果店 / candy
思路和算法
如果
每个糖果可以拆成两种糖果:
- 个数
2 ,价格x_i+y_i ,无限购买。 - 个数
1 ,价格x_i ,只能买一个。
对于只能买一个的这部分,既然个数都是
对于买两个的这部分,由于是无限的,我们只会买最便宜那种。记
因此购买方案一定为购买了若干对糖果
时间复杂度
也可以视为背包,
T2 清仓甩卖 / sale
思路和算法
对于一种定价方案,假设糖果已经按照性价比降序排序:
考虑最后一颗购买的糖果
具体来说,设按顺序购买了糖果
设
将
细节比较多,
时间复杂度
T3 树的价值 / tree
思路和算法
这是个最优化问题,先考虑最优解长什么样。
观察、调整,可以得到几个基本结论:
- 不会有祖孙标同样的号。一个数字已经让它到根路径点的数字集合都有这个数了,祖先再这么干就浪费了。
- 不会有祖先比子孙标号小。在上一条基础上容易发现这一点。
- 每个点只有两种可能的决策,要么让自己的答案变大,要么给祖先产生贡献,否则肯定浪费。
- 进一步地,我们可以把每个点标为黑白两种颜色之一,分别表示答案变大(
\mathrm{mex} 比每个儿子的都大)的点以及答案不变大(\mathrm{mex} 等于儿子的最大值)的点,然后自底向上决策。可以归纳证明对于特定的染色方案,最优解就是把每个白点分给祖先里最近的黑点(否则不如把最近的黑点也变白一起向上贡献),然后遇到黑点时它的\mathrm{mex} 是子树内所有黑点\mathrm{mex} 最大值加上分给它的白点个数再+1 (它自己的贡献。)。
明显可以自底向上递推,比如我们可以设计一个暴力 DP:
怎么优化呢?我们继续考虑最优解的结构,可以发现更多性质:
- 每个黑点必然有至少一个黑儿子。如果一个黑点
u 全是白儿子,我们找到它子树内所有黑点\mathrm{mex} 最大的v ,通过重排分给u 的白点可以让子树内黑点值都不变的情况下v 到u 路径都变成黑点,这一定更优。如果子树内全是白点则要么这个黑点本身变白更优,要么仍然前述更优。 - 所以,把每个黑点和它继承的黑儿子连起来,有一个链剖分结构。我们设每个点的重儿子是它所有儿子中
\mathrm{mex} 最大的那个,这也是它最大的黑儿子。 - 每个黑点都有黑色重儿子,所以链都是直通叶子的,每个链都是上白下黑。
- 可以发现每个黑点的
\mathrm{mex} 就等于它所属链往下的黑点个数,加上这些点的轻儿子向下连通的连续白点个数之和。白点的\mathrm{mex} 等于重儿子的。 - 我们发现在这个链剖分结构上,贡献可以拆分给各个链。点的贡献,是祖先中第一个黑点在自己链的深度。所有贡献都可以在链之间的树上自底向上统计。
那么我们考虑改为这个状态 DP:尝试设
因此状态需要记录中间值
使用长链剖分优化可以做到理论上
一开始的时候以为的
O(nm) 转移是想简单了。这个问题的确有子树u 内在不知道其余部分的情况下可能成为最优子结构的本质不同极优解个数不超过\min(sz,dep) (子树大小和u 到根深度)的性质。但是转移合并是链合并不是儿子合并,所以和树形背包的复杂度分析结论不同。直接维护转移的复杂度会退化到O(\min(n^2,nm^2)) ,只能得80 分。能否继续挖掘子树最优决策性质,快速找到子树最优决策,从而优化枚举链的转移复杂度?比如说贪心微调或者决策单调性之类的?
T4 序列询问 / query
思路和算法
问题问的是:每个合法区间的区间和,分别贡献到区间内每个位置
数据范围允许
那么这里关键的是所有合法区间的整体结构。画到平面上,可以发现是一个斜条带:
怎么统计这个呢?这种梯形区间集合是比较难统计的,我们统计只有一侧长度限制还行,两侧限制就比较难。所以划分一下:
把合法区间集合划分成若干个三角形统计。这些三角形中每一个实际上都是两种形式之一:
- 某个给定区间
[L,R] 的子区间,且长度\ge C 。 - 某个给定区间
[L,R] 的超区间,且长度\le C 。
这两种情况的贡献,可以枚举
具体来说:
- 某个给定区间
[L,R] 的子区间,且长度\ge C 。- 当
C 大于区间长度一半,设区间中点(或者第C 个点也行)为m ,必经m 。- 对于这种情况,我们设一个要统计的区间是
[l,r] (l\le L\le R\le r) 。那么它可以被视为减去前缀[L,l) 再减去前缀(r,R] 再加上固定的[L,R] 。后缀和前缀的总长度不超过某个定值。 - 首先预处理每个前缀和后缀的最小后缀和/前缀和。
- 枚举每个
l ,查出这个l 对应的所有可能r 的最大区间和,并且贡献给(l,m] 。 - 枚举每个
r ,查出这个r 对应的所有可能l 的最大区间和,并且贡献给(m,r) 。 - 再枚举每个
l,r ,把上述(l,m] 和(m,r) 的贡献实际贡献到每个位置。
- 对于这种情况,我们设一个要统计的区间是
- 否则,每隔
C 个选一个关键点m_1,m_2,\dots ,区间至少经过一个关键点。枚举第一个经过的关键点统计区间,统计方法仍然类似。 - 分两种情况处理是为了保证
C 较大但C 和区间长度差距小时,复杂度是正确的和区间长度减C 同阶,而不是区间长度同阶。你也可以认为其实都是每隔C 个选一个关键点,但处理方法还是要分类。
- 当
- 某个给定区间
[L,R] 的超区间,且长度\le C 。- 对于这种情况,我们设一个要统计的区间是
[l,r] (l\le L\le R\le r) 。那么它可以被视为后缀[l,L) 拼接上前缀(R,r] 再加上固定的[L,R] 。后缀和前缀的总长度不超过某个定值。 - 首先预处理每个前缀和后缀的最大后缀和/前缀和。
- 枚举每个
l ,查出这个l 对应的所有可能r 的最大区间和,并且贡献给[l,L) 。 - 枚举每个
r ,查出这个r 对应的所有可能l 的最大区间和,并且贡献给(R,r] 。 - 再枚举每个
l,r ,把上述[l,L) 和(R,r] 的贡献实际贡献到每个位置。 - 把上面所有的贡献的最大值贡献给
[L,R]
- 对于这种情况,我们设一个要统计的区间是
时间复杂度和贡献区间个数是
然后算答案。上面的统计我们一共给出了
总之这个问题的关键是采样法,即找到一些关键点,满足定长度限制的区间一定经过这些关键点,然后拆分前后缀进行统计。直接进行倍增采样(倍增值域分块)也可以做。
采用较好的统计顺序可以不用维护任意区间最值查询,都改用单调队列等统计,可以改进到单纯的
题外话
知识点征集项目中 NOIP2025 T4 序列询问 / query 的技巧内容:
- R183. 带长度限制的区间统计(条状/梯形分治) - Guoyh ← liaoz123
- R276. 定长分块(定距采样法) - nzhtl1477
- R528. 倍增值域分块(倍增采样法) - 「佚名」
更多知识请看 知识点征集速报!!!! 第二期(2025.11.12-11.16) - 星语社Σ*
来参与征集! 有奖征集 OI 小知识点,思考题和科普
个人著作权声明:严禁任何未经本人(刘承奥,常用笔名/网名:蔡德仁 CommonAnts LCA liu_cheng_ao)书面授权者在梦熊联盟,或者任何虚假宣传或不实营销炒作或不正当竞争行为严重的 OI 机构的课程内或交流平台(包括但不限于品牌集训线下讨论,交流群,OJ,公众号,视频号等)上引用、传播、讨论此内容,以及本人于2024年5月及之后发布的所有内容,包括声明为公开的内容在内。