树状数组优化LIS到nlogn,网上找了好多,感觉讲得都不是很明白,正好自己复习整理一下。

基本的DP方程 f[i]=max(f[i],f[j]+1) (j<i且a[j]<a[i])

定义一个数组b

以a[i]为下标

存储 以a[i]结尾的最长上升子序列长度

例如 序列 5 2 1 3 4

最终b数组如下

i 1 2 3 4 5
b 1 1 2 3 1

定义它有什么好处呢?

每次转移f[i],是找f[j]的过程,有两个条件:

1. f[j]最大值

2. j<i

第二个j<i好说,用循环卡范围在[1,i-1]即可。

那第一个条件呢?a在[1,i-1]的最大值,区间最值,RMQ问题?

用什么呢?ST表?不行,我们要更改。

注意到这个区间一定是一个前缀区间,那树状数组呢? 树状数组本质是求前缀和的,当然可以改造成求前缀最大值啦。

void query(int now){
int ret=0;
while(now){
ret=max(ret,t[now]);
now-=now&-now;
}
return ret;
} void updata(int now,int w){
while(now<=n){
t[now]=max(t[now],w);
now+=now&-now;
}
}

再具体考虑一下转移,先考虑限制a[j]<a[j]的问题

把a数组离散化,1-n个下标对应1-n个数

定义v为a[i]

那就是求出b[1],b[2],… ,b[v-1]的最大值,这个可以用树状数组。

那j<i的问题呢?

换言之,b[1~v-1]是可以求最大值,那怎么*保证这些比a[i]小的数一定在i前面*呢?

答案是:不需要保证

在i前面的数,之前已经更新过,所以b数组中这些数有了值,而i之后的数,尚未访问过,就是0。

0是不影响最大值的。

所以,我们的大体思路已经成型了:

  1. 求出b[1],b[2],…,b[v-1]的最大值

  2. 用这个最大值+1更新b[v]

再次强调上述的v是里当前正在更新的那个数,也就是a[i],i是下标,v是树状数组的下标。

所以,这个b数组不需要真实存在,用树状数组假装它存在,实际上维护前缀最大值就行。

复杂度估计一下,循环遍历n个数,每次找前缀最大值logn,合计O(nlogn)

//Stay foolish,stay hungry,stay young,stay simple
#include<iostream>
#include<algorithm>
using namespace std; const int MAXN=20000; int a[MAXN],tmp[MAXN],f[MAXN];
int n; int t[MAXN];
inline void updata(int now,int w){
while(now<=n){
t[now]=max(t[now],w);
now+=now&-now;
}
}
inline int query(int now){
int ret=0;
while(now){
ret=max(ret,t[now]);
now-=now&-now;
}
return ret;
} int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
tmp[i]=a[i];
}
sort(tmp+1,tmp+1+n);
int tot=unique(tmp+1,tmp+1+n)-tmp;
for(int i=1;i<=n;i++)
a[i]=lower_bound(tmp+1,tmp+1+tot,a[i])-tmp;
int ans=1;
for(int i=1;i<=n;i++){
f[i]=query(a[i]-1)+1;
updata(a[i],f[i]);
ans=max(f[i],ans);
}
cout<<ans<<endl;
return 0;
}

[模板] LIS的更多相关文章

  1. [模板]LIS(最长上升子序列)

    转载自:最长上升子序列(LIS)长度的O(nlogn)算法 最长上升子序列nlogn算法 在川大oj上遇到一道题无法用n^2过于是,各种纠结,最后习得nlogn的算法 最长递增子序列,Longest ...

  2. 【小小复习·大米饼】

    (一)数位DP模板 ·LIS的数位DP: ·含b进制数个数+数形结合的数位DP ·平衡数的数位DP: (二)网络流问题 ·Edmonds_Karp:(见书)·Dinic(见书)·ISAP(见书)·例题 ...

  3. 学大伟业 Day 4 培训总结

    今天讲的全是dp... 不多废话,先看一道经典的模板LIS(最长不下降子序列) 一.LIS 给定一个长度为N的数列,求最长上升子序列 例:1 7 2 8 3 4 答案:1 2 3 4 代码: #inc ...

  4. nlogn LIS模板

    nlogn 模板 最长上升 #include<bits/stdc++.h> using namespace std; ; int n,x,y,a[N],num[N],d[N],len; / ...

  5. 动态规划模板1|LIS最长上升子序列

    LIS最长上升子序列 dp[i]保存的是当前到下标为止的最长上升子序列的长度. 模板代码: int dp[MAX_N], a[MAX_N], n; int ans = 0; // 保存最大值 for ...

  6. LIS严格递增和非递减模板

    2017-09-10 16:51:03 writer:pprp 严格递增的LIS模板 #include<stdio.h> #include<string.h> #include ...

  7. LCS/LIS/LCIS 模板总结

    /************************* LCS/LIS/LCIs模板总结: *************************/ /*************************** ...

  8. LIS n^2&nlogn模板

    LIS nlogn模板 http://acm.hdu.edu.cn/showproblem.php?pid=1950 #include <iostream> #include <st ...

  9. 最长上升子序列(LIS)nlogn模板

    参考https://www.cnblogs.com/yuelian/p/8745807.html 注意最长上升子序列用lower_bound,最长不下降子序列用upper_bound 比如123458 ...

随机推荐

  1. CSU_1216【异或最大值】

    转自:http://blog.csdn.net/fuyukai/article/details/50366133 题目简述: 经典题目,求一个数组中两个数异或运算的最大值.题目极其简单,但是要求的复杂 ...

  2. 公司内网,无法使用yum在线下载,肿么办?

    1 配置上网代理 编辑/etc/yum.conf,增加如下属性: proxy=你的代理地址 proxy_user=你的用户名 proxy_password=你的密码 2 配置国内163 yum源 备份 ...

  3. LuoguP2320/CF1037A 用二进制表示数的奥妙重重方法 By cellur925

    题目描述 鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政. 有一天,他在咸阳游历的时候,朋友告诉他在咸阳最大的拍卖行(聚宝商行)将要举行一场拍卖会,其中有一件宝物引起了 ...

  4. win32 指令大全

    指令类型 助记符 (带*为特权指令) 对标志寄存器的影响 备注 说明 举例 ZF CF PF SF OF AF DF IF TF 数据传送类 数据传送 MOV 不影响标志位 Move MOV r/m3 ...

  5. 跟我一起玩Win32开发(25):监视剪贴板

    自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...

  6. JDBC全部分析

    2.1.搭建实验环境 1.在mysql中创建一个库,并创建user表和插入表的数据. SQL脚本如下: 1 create database jdbcStudy character set utf8 c ...

  7. 日历 php

    <?php $year=@$_GET['year']; //获得地址栏的年份 $month=@$_GET['month']; //获得地址栏的月份 if(empty($year)) $year= ...

  8. 137 Single Number II 数组中除了一个数外,其他的数都出现了三次,找出这个只出现一次的数

    给定一个整型数组,除了一个元素只出现一次外,其余每个元素都出现了三次.求出那个只出现一次的数.注意:你的算法应该具有线性的时间复杂度.你能否不使用额外的内存来实现?详见:https://leetcod ...

  9. Haproxy+Rabbitmq中的问题

    问题一.Rabbitmq集群搭建完成 某个集群节宕机后 无法添加失败 解决办法:停掉所有Rabbitmq服务 并删除集群文件C\Users\Administrator\AppData\Roaming\ ...

  10. 各个浏览器CSS中的Bugs及解决方案

    Bugs及解决方案列表(以下实例默认运行环境都为Standard mode): 如何在IE6及更早浏览器中定义小高度的容器? 方法: #test{overflow:hidden;height:1px; ...