利用C++优势快速打完最长不下降子序列

n log n求最长不下降子序列

我们设d[i]表示长度为i的最长不下降子序列最尾元素的最小值,显然d[i]<=d[i+1],d数组符合单调性。因此对于a[i]只需在d数组中二分即可。

lower_bound与upper_bound

lower_bound(a+l,a+r+1,key)表示在a数组的l~r范围进行二份查找(注意你需要保证这个数组的单调性,可以加cmp来表达他的单调性,默认单调性是非递减),找到第一个>=key的位置并返回。
而upper_bound则是找到第一个>key的位置返回。
求最长不下降子序列可以利用C++STL中algorithm库里的这两个东西来减少代码量。附代码

fo(i,1,n){
        k=upper_bound(d+1,d+n+1,a[i])-d;
        ans=max(ans,k);
        d[k]=min(d[k],a[i]);
    }

如果要求最长上升子序列改成lower_bound即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值