题意简述

给出一个长度为 \(n\) 的序列 \({a_n}\) , 找出一个子序列 \({b_k}\) ,使其满足
\(\min(b_1, b_2) \leq \min(b_2, b_3) \leq ··· \leq \min(b_{k - 1}, b_k)\) ,求 \(k\) 的 最大值。

\(\forall 1 \leq a_i \leq n, n \leq 5 \times 10 ^ 5\)

题解

相当于一个变形的 LIS,对于普通的 LIS 可以树状数组优化 dp 。注意到如果子序列b是一个 LIS 那么显然符合题意,如果在 LIS 相邻元素间插入一个比它们都大的数也符合条件,那么可以得到一个 dp :

\[f_i = \max_{j <i, a_j <= a_i}{f_j + 1 + [\max_{k = j + 1} ^ {i - 1} a_k > \max(a_j, a_i)]} \]

对于每个 \(i\) 用单调栈预处理出 \(pre_i\) 表示 \(i\) 左边第一个大于 \(a_i\) 的位置,若上个决策点 \(j < pre_i\) 表示中间插了数,否则直接转移。

\[f_i = \max(\max_{j < pre_i} \{f_j\} +2, \max_{pre_i\leq j < i} \{f_j\} + 1) \]

posted on 2023-10-26 21:45  Elegos  阅读(22)  评论(1)    收藏  举报