LIS LDS 结构 杨表 随机解题报告
QOJ 17424 Increase Decrease(弱化版:ARC091E)
给定每个前缀的 LIS,LDS,构造排列。
每步操作至多使 LIS,LDS 增加 1,且 LIS,LDS 不会同时增加 1。
LIS 增加 1 / LDS 增加 1 容易构造,而 LIS,LDS 都不变时排列长度最多为二者之积,考虑如何卡满这个上界,
可以发现构造这样的杨表形状即可:

为什么必须是杨表形状:
先补齐上面,之后补齐下面时,上面的不会受影响,
而先补齐下面,之后补齐上面时,下面的也会接上去:

所以这样一定卡不满上界。
所以只能先补上面再补下面,自然形成杨表形状。
QOJ 18131 Rounddog
给定排列,对每个前缀问,最多能在这个前缀后加多少个实数使 LIS,LDS 均不变。
这我都会???
先尝试套用一下上一个题的杨表结构,在 LDS 的每一项后面接和 LIS 一样长的上升子序列,然后就被样例卡了,
关键问题在于这题的排列不是自己构造的杨表形状。
但感受一下,在 LDS 上挂 IS 的策略大概率还是对的,不妨考虑到底能挂多少 IS。
先考虑在 LDS 的最后一位上挂,首先这个最后一位一定是 LDS 的最大结尾,不然 LDS 会变长:

那这个 IS 可以和 LIS 一样长吗?可以发现也是不行的,
设 LDS 的最后一位为 \(x\),结尾 \(\le x\) 的 IS 最长为 \(k\),则在 \(x\) 后挂的 IS 长度不能超过 LIS - k:

也就是说,维护 \(f_i\) 表示长度为 \(i\) 的 IS 的最小结尾(\(f\) 就是贪心求 LIS 时维护的数组,也是杨表的第一行),
则 \(k\) 即为 \(f\) 中 \(\le x\) 的数的个数,\(x\) 后挂的 IS 长度 LIS - k 即为 \(f\) 中 \(>x\) 的数的个数。
再考虑 LDS 倒数第二位,先考虑以下应该在【LDS 的最大倒数第二位】还是【长度为 LDS - 1 的 DS 的最大结尾】后面接,
可以发现应该是后者,不然 LDS 会变长:

同理,设长度为 LDS - 1 的 DS 的最大结尾为 \(y\),则 \(y\) 后挂的 IS 长度即为 \(f\) 中 \(>y\) 的数的个数,
以此类推,我们可以在每个【长度为 \(i\) 的 DS 的最大结尾】后挂 IS,设 \(g_i\) 表示长度为 \(i\) 的 DS 的最大结尾(\(g\) 与 \(f\) 维护方法相同),
则 \(g_i\) 后挂的 IS 长度即为 \(f\) 中大于 \(g_i\) 的数的个数,答案即为 \((i,j)|g_i<f_j\) 的个数。
考虑对每个前缀算答案,每次算下一个前缀时只需要对 \(f,g\) 单点修改,权值树状数组维护即可。

浙公网安备 33010602011771号