前言

第一次场切 G(虽然被 after_contest 叉了),纪念一下。

思路

贪心地,考虑最优秀的操作一定是修改中间的一个元素,把左右两边的 LIS 接在一起。

于是可以预处理每个以每个下标 ii 开头 / 结尾的最长 LIS 长度 RiR_iLiL_i,然后枚举右边 LIS 开头的下标 rr,代表修改 ar1a_{r-1} 的值,则答案为 maxr=2n+1{Rr+maxl=0r2{Ll}(al+1<ar)+1}\max^{n+1}_{r=2}\{R_r+\max_{l=0}^{r-2}\{L_l\}(a_l+1<a_r)+1\}

预处理和统计答案使用离散化 + 线段树优化 dp 实现即可,时间复杂度为 O(nlogn)\mathcal{O}(n\log n)

需要注意的是统计答案时,应先将 a0a_0 设为极小值,an+1a_{n+1} 设为极大值,这样就可以分别覆盖到左边的 LIS 为空和右边的 LIS 为空的情况,after_contest 叉的也就是这两种边界情况。

代码

link