给定一个长度为 \(n\) 的排列 \(a\),问其有多少个子串 \(b\),使得 \(LIS(b) + LDS(b) = |b| + 1\)
\(n \le 2 \times 10^5\)
考虑一下题目给的条件在说啥,其实就是每个元素都在 \(LIS/LDS\) 中,只有一个相交的地方(因为时排列),类似一个 "X" 形。
这个相交的点看起来就是这个构图的关键:就是这个交点 \(x\),找到最小的 \(l\) 和最大的 \(r\) 满足 \(l \le x \le r\) 且满足条件即可,然后贡献是 \((x - l + 1)(r - x + 1)\)。
因为 \(l, r\) 是独立的,假设现在求 \(l\)。
对于 \(< x/> x\) 的元素分开考虑,对于\(< x\) 的元素,其实就是找到一个最大的 \(y\) 满足 \(a_y < a_{y - 1} < a_x\)(其实应该是找到一个 \(z\),满足 \(a_z < a_x\) 且 \(\min \{ a_{z + 1} a_{z + 2}, \dots a_{i - 1} \} < a_z\),化简一下就是前面那个)。
用个单调栈维护 \(a_{y} < a_{y - 1}\) 的位置,搞个前缀最大值即可。(推一推如果 \(l\) 对于 \(i\) 不满足,对于 \(i + 1\) 也是不满足的,根据 \(a_i, a_i + 1\) 套路一下即可。)
最后发现可能一个子串可能被多次算到,将 \(x\) 对应到一个矩形里,暴力算矩形并即可。但是实际有更简单的方法,因为我们得到的矩形横竖轴的 \(l, r\) 都是单调不减的,只需要和前一个矩形取并即可。
时间复杂度:\(O(n)\)。
转化题目条件,抓住关键点 \(x\),再算答案,思路还是挺顺畅的,组合起来有点难。