最长上升子序列nlogn通解(dp之线段树优化)

17 篇文章 0 订阅
10 篇文章 0 订阅

   对于任何一个子序列,我们可以轻易的列出dp方程。dp[i]=max(dp[i],dp[j]+1);其中a[j]<a[i].但这是n^2的必然T。我们在仔细地看一下这个方程,我们只是要求高度小于等于a[i]里面的最大的dp值,如果高度是整数,也就是求1~a[i]的高度里面dp值最大,这里已经很明显,这个就是一个线段树的区间查询的过程。但是高度很大数组开不下怎么办?离散化一下,区间便变成了1~n。

    每次求dp值的时候先查询,先求出a[i]在整个有序序列中的位置(二分),假如是p,那就查询1~p之间最大的dp值。然后求出dp[i],再把dp[i]插入p这个位置的线段树中。

   推荐题:Codeforces Round #271   E  Pillars

          acdream 1216  Beautiful People


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值