CF1647F
给定排列 \(p\),将其划分为两个单峰子序列,求两个单峰子序列的峰的组合的情况数。
\(2 \leq n \leq 5\times 10^5\)
-
首先要注意到一个非常常见的地方:两个单峰子序列中的一个的峰值一定在整个排列 \(p\) 的最大值处
-
这个非常显然,但并不注意到他的重要性,容易被忽视
-
为了方便,我们设序列最大值为峰顶的子序列为 \(a\),另外一个为 \(b\),序列最大值位置为 \(x\)
-
因此我们可以在这个峰值的基础上枚举另一个单峰子序列的峰值位置,因此原序列就可以被划分成 \(3\) 种情况:
-
- 子序列 a 只需保持严格上升即可,而 b 要求最大值尽可能的小
-
设 dp_i 表示前 i 个数划分成两个严格上升序列,不以 p_i 结尾的子序列最大值最小
-
可以得到转移:
- \[\begin{cases} dp_i \leftarrow dp_{i-1} & (p_i > p_{i-1}) \\ dp_i \leftarrow a_i & (dp_{i-1} < a_i) \\ \end{cases} \]
-
- 需要划分序列为递增与递减序列
-
设 \(f_i\) 表示把 \([x,i]\) 划分为一个上升序列和一个下降序列,上升序列的起始 \(\geq dp_x\),末尾值属于上升序列时下降序列末尾最小可能值
-
设 \(g_i\) 表示把 \([x,i]\) 划分为一个上升序列和一个下降序列,上升序列的起始 \(\geq dp_x\),末尾值属于下降序列时上升序列末尾最大可能值
-
可以得到转移:
- \[\begin{cases} f_i \leftarrow f_{i-1} & (p_{i-1} < p_i) \\ f_i \leftarrow p_{i-1} & (g_{i-1} < p_i) \\ g_i \leftarrow g_{i-1} & (p_{i-1} > p_i) \\ g_i \leftarrow p_{i-1} & (f_{i-1} > p_i) \\ \end{cases} \]
-
- 与 1 情况类似
-
-
先预处理出 \(dp\) 式子,然后枚举 \(b\) 序列的最大值进行更新答案即可
-
最终复杂度 \(O(n)\)