fogflea
fogflea
发布于 2025-10-24 / 5 阅读
0
0

[OOI 2023] Music Festival

首先简化问题很明显,每组有用的只有前缀最大值。

先想想贪心,不可做,因为一组的贡献会被其他组影响,所以考虑 \texttt{dp}

组与组之间无序,不能沿编号轴 \texttt{dp} ,考虑值域轴,每接上一个组只需要考虑当前最大值,且较大最大值一定由较小最大值转移而来,所以设 f_i 表示当前最大值为 i 的最优值,方程:

f_i=\max_{0\leq j< i,p\in M_i}\{f_j+cnt(p,j)\}

其中 M_i 表示最大值为 i 的专辑集合, cnt(p,j) 表示在专辑 p>j 的元素个数,暴力转移是 O(n^2) 的。

考虑优化,注意到总元素个数是 O(n) 级别的,所以每次依赖每个元素转移,具体做法:用线段树维护 f_{0...j} ,每次转移暴力枚举一个专辑相邻的两个元素对 f 数组的贡献做一个区间加取 \max ,同时维护叶子原始值保证下次转移还能用,复杂度 O(n\log n)


评论