在OI Wiki看到这样一段话:
当 n 的范围扩大到 n≤105 时,第一种做法就不够快了,下面给出了一个 O(nlogn) 的做法。
首先,定义 a1…an 为原始序列,d 为当前的不下降子序列,len 为子序列的长度,那么 dlen 就是长度为 len 的不下降子序列末尾元素。
初始化:d1=a1,len=1。
现在我们已知最长的不下降子序列长度为 1,那么我们让 i 从 2 到 n 循环,依次求出前 i 个元素的最长不下降子序列的长度,循环的时候我们只需要维护好 d 这个数组还有 len 就可以了。关键在于如何维护。
考虑进来一个元素 ai:
元素大于等于 dlen,直接将该元素插入到 d 序列的末尾。
元素小于 dlen,找到第一个大于它的元素,用 ai 替换它。
没理解最后一句关于元素小于 dlen 的操作
比如 a1=1,a2=3,a3=4,a4=2 ,现在 i=4 ,要怎么对 ai=2 操作