首先简化问题很明显,每组有用的只有前缀最大值。
先想想贪心,不可做,因为一组的贡献会被其他组影响,所以考虑 \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)