求助,关于最长不下降子序列
  • 板块学术版
  • 楼主bsdsdb
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/5/29 23:03
  • 上次更新2023/10/23 14:20:07
查看原帖
求助,关于最长不下降子序列
790188
bsdsdb楼主2023/5/29 23:03

在OI Wiki看到这样一段话:

当 nn 的范围扩大到 n≤105n \leq 10^5 时,第一种做法就不够快了,下面给出了一个 O(nlog⁡n)O(n \log n) 的做法。

首先,定义 a1…ana_1 \dots a_n 为原始序列,dd 为当前的不下降子序列,lenlen 为子序列的长度,那么 dlend_{len} 就是长度为 lenlen 的不下降子序列末尾元素。

初始化:d1=a1,len=1d_1=a_1,len=1。

现在我们已知最长的不下降子序列长度为 11,那么我们让 ii 从 22 到 nn 循环,依次求出前 ii 个元素的最长不下降子序列的长度,循环的时候我们只需要维护好 dd 这个数组还有 lenlen 就可以了。关键在于如何维护。

考虑进来一个元素 aia_i:

元素大于等于 dlend_{len},直接将该元素插入到 dd 序列的末尾。 元素小于 dlend_{len},找到第一个大于它的元素,用 aia_i 替换它。

没理解最后一句关于元素小于 dlend_{len} 的操作

比如 a1=1,a2=3,a3=4,a4=2a_1=1,a_2=3,a_3=4,a_4=2 ,现在 i=4i=4 ,要怎么对 ai=2a_i=2 操作

2023/5/29 23:03
加载中...