ABC248Ex Beautiful Subsequences

发布时间 2023-07-21 08:29:57作者: Ender_32k

然而这个经典做法是分治,我不太会做,但这确实是一道经典题。

考虑扫描线,对从左到右每个点 \(r\),统计以 \(r\) 作为右端点的区间个数。

由于 \(r\) 端点固定,\(S(l)=\max\limits_{i=l}^r{P_i}-\min\limits_{i=l}^r{P_i}-r+l\ge 0\),所以只需要统计 \(S(l)\)\([0,k]\) 区间处的 \(l\) 的个数,于是只需要维护前 \(k+1\) 小值即可。由于 \(k\) 比较小,可以使用线段树维护前 \(k+1\) 小值。

考虑移动端点 \(r\)\(S(l)\) 的贡献,这是个经典问题,可以用两个分别维护了最大值和最小值的单调栈做。每次的贡献就拆成若干段区间,进行区间修改即可。

复杂度 \(O(nk\log k\log n)\),精细实现可以 \(O(nk\log n)\)