CF474E Pillars (线段树优化DP)

题目链接

题目大意

给出一个长度为 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]mmax{ 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值