difficulty 非常恐怖的题,但是远没有这么难。
考虑对于确定的序列 \(a_1,a_2,...,a_n\) 来说,如何判断 \(a\) 能否栈排序。
容易发现 \(a\) 可以栈排序的充要条件是不存在 “\(2-3-1\)” 型的子序列,即不存在三个位置 \(i\lt j\lt k\) 满足 \(a_k\lt a_i\lt a_j\)。
如果我们从前往后地进行 dp,则很难维护所需要的内容。
联想到笛卡尔树,我们可以想到区间 dp:设 \(f(l,r,x,y)\) 是 \([l,r]\) 这一段区间,最长的,每个数都在 \([x,y]\) 范围内的合法序列长度。
转移的时候,枚举最大值的位置,然后枚举左侧的最大值,即可推出右侧的最小值,因为 \(n\) 与值域同阶,所以复杂度可以视作 \(O(n^6)\)。
P.S. 容易发现,容易优化到 \(O(n^5)\) 的复杂度;另外,本题的计数版本也是类似的做法。
标签:复杂度,枚举,lt,序列,杂题,dp From: https://www.cnblogs.com/Cry-For-theMoon/p/16653000.html