题目大意
给出一个长度为 n n n 的序列 a a a 和一个参数 m m m,要求求出一个最长的子序列,满足相邻元素的差大于等于 m m m
解题思路
本题跟LIS的 O ( n log n ) \operatorname{O}(n\log n) O(nlogn) 做法非常相似,需要用到桶。
首先,我们要将 a [ i ] a[i] a[i] 离散化。
设 f [ i ] f[i] f[i] 表示以 a [ i ] a[i] a[i] 结尾的最长满足条件的子序列的长度, p r e [ i ] pre[i] pre[i] 表示 f [ i ] f[i] f[i] 从 f [ p r e [ i ] ] f[pre[i]] f[pre[i]] 转移过来。
朴素转移: f [ i ] = max ∣ b [ i ] − b [ j ] ≥ m ∣ { f [ j ] } + 1 f[i]=\max\limits_{|b[i]-b[j]\ge m|}\{f[j]\}+1 f[i]=∣b[i]−b[j]≥m∣max{
f[j]}+1。
这里的 b [ i ] b[i] b[i] 表示离散化之前的 a [ i ] a[i] a[i]。
我们考虑用桶优化:
设桶 b i n [ j ] bin[j] bin[j] 表示以 j j j 结尾的序列的最长长度, p o s [ j ] pos[j] pos[j] 表示与 b i n [ j ] bin[j] bin[j] 对应的结尾元素的编号。
由于 a [ i ] a[i] a[i] 已经被离散化了,我们需要用二分查找出与 i i


被折叠的 条评论
为什么被折叠?



