题解:AT_abc262_g [ABC262G] LIS with Stack

CleverLiu

2024-11-15 22:18:25

Solution

显然,我们最好让 X 不递减。在这篇题解中,我们隐含地假设 X 是非递减的。
首先,我们可以假设立即舍弃不在 X 中的整数。根据这一假设,S 最终应该是空的。此外,推入 S 的任何整数都不应小于 S 中的任何其他元素;尤其是,当生成的 X 中的最大整数 M 首次被移入 S 时,S 应该是空的。
根据这一思路,请考虑下面的 \mathrm {dp}

本题答案为 \mathrm{dp}_{1,N,1,50}
现在我们来考虑转换。

当结果 X 中不包含 l 时的转换

对应于 \mathrm {dp}_{i,j,k,l-1}

当结果 X 包含 l 时的转换

对于 a_m=l 这样的每个项,假设 l 在移动该项时第一次被移动,模拟其过渡。如前所述,此时 S 必须为空。另外,如果 n 是结果 X 中出现在 a_m 之前的最大项,那么我们就不能在 X 中的 a_m 之后包含一个小于 n 的整数。(注意,n 已经是 X 的最后一项,因为 S 是空项。)

反过来,假设 X_1Xa_m 之前的部分,X_2a_m 之后的部分(不使用小于 n 的整数);那么我们可以通过连接 a_m,X_1,X_2 得到 (1+|X_1|+|X_2|) 项中的 X。因此,过渡项 \mathrm{dp}_{i,j,k,l} = \underset{k \leq n \lt l}{\max}(1 + \mathrm{dp}_{i,m-1,k,n} + \mathrm{dp}_{m+1,j,n,l}) 是有效的。(由于我们在讨论中假定 ma_m=l 的第一个位置,所以我们没有将 l 包含在 n 的范围内,但包含它也是可以的)。

我们来分析一下时间复杂度。我们假设 a_i 的最大值等于 N。(我们假设 a_i 的最大值等于 N (即使不等于,我们也可以进行坐标压缩,使其等于 N)。)\mathrm{dp}\mathrm{O}(N^4) 个状态,在实现中,我们需要找到每个 DP 元素的位置,使其等于 a_m=l,因此这部分需要花费 \mathrm{O}(N^5) 个时间。此外,检查每个 a_m=ln 会带来一个 \mathrm{O}(N) 过渡,当每个 (i,j,k)l=a_i,l=a_{i+1},\ldots,l=a_{j} 出现时,就会产生一个 \mathrm{O}(N) 过渡,因此这部分也会花费总计 \mathrm{O}(N^5) 的时间。直接将约束条件赋值到这个多项式中会得到 50^5=312500000,对于两秒的时间限制来说,这个数字看起来太大了,但常数足够小,可以满足时间限制的要求。有些实现可能需要 \mathrm{O}(N^6),如果你对常数足够谨慎,这可能仍然符合时间限制。

译自官方题解。