参考https://www.cnblogs.com/yuelian/p/8745807.html

注意最长上升子序列用lower_bound,最长不下降子序列用upper_bound

比如123458, 加入了5

假设求最长上升子序列

这个时候只能替换5,不能替换8(严格上升)

虽然没有用,但是这样不会错,写upper_bound就错了。

假设求最长不下降子序列

这样应该替换8,替换5并不是最优的

所以用upper_bound

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

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 51234;
int a[MAXN], f[MAXN], n; //a数组从0开始,f数组从1开始 int main()
{
scanf("%d", &n);
REP(i, 0, n) scanf("%d", &a[i]);
int len = 1;
f[1] = a[0]; //初始化
REP(i, 1, n)
{
if(a[i] > f[len]) f[++len] = a[i]; //这里是++len 若是不下降就改为>=
else f[lower_bound(f + 1, f + len + 1, a[i]) - f] = a[i]; //注意f数组是从1开始
}
printf("%d\n", len);
return 0;
}

最长不下降子序列(LIS)nlogn模板

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 51234;
int a[MAXN], f[MAXN], n; int main()
{
scanf("%d", &n);
REP(i, 0, n) scanf("%d", &a[i]);
int len = 1;
f[1] = a[0];
REP(i, 1, n)
{
if(a[i] >= f[len]) f[++len] = a[i]; //>改成>=
else f[upper_bound(f + 1, f + len + 1, a[i]) - f] = a[i]; //lower_bound改成upper_bound
}
printf("%d\n", len);
return 0;
}

如果要求最长下降子序列或者最长不上升子序列符号改变,同时二分加上cmp即可

另外有个神奇的定理

如果是求一个数组最少分成几组最长不上升子序列的话

答案就是最长上升子序列(上升改成下降也成立)

导弹拦截那题要用到

输出路径的版本,见https://blog.csdn.net/lxcxingc/article/details/81238008

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 51234;
int a[MAXN], f[MAXN];
int ans[MAXN], pos[MAXN], n; int main()
{
scanf("%d", &n);
REP(i, 0, n) scanf("%d", &a[i]);
int len = 1;
f[1] = pos[1] = a[0];
REP(i, 1, n)
{
if(a[i] > f[len]) f[++len] = a[i], pos[i] = len;
else f[pos[i] = lower_bound(f + 1, f + len + 1, a[i]) - f] = a[i];
}
printf("%d\n", len); int maxx = 1e9, t = len;
for(int i = n - 1; i >= 0; i--)
{
if(t == 0) break;
if(pos[i] == t && maxx > a[i])
{
maxx = a[i];
ans[t--] = a[i];
}
}
REP(i, 1, len + 1) printf("%d ", ans[i]);
puts(""); return 0;
}

最长上升子序列(LIS)nlogn模板的更多相关文章

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

    LIS定义 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1 ...

  2. 最长上升子序列 LIS nlogn

    给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的n个整数组成的序列. Output 最长上升子序 ...

  3. AT2827 最长上升子序列LIS(nlogn的DP优化)

      题意翻译 给定一长度为n的数列,请在不改变原数列顺序的前提下,从中随机的取出一定数量的整数,并使这些整数构成单调上升序列. 输出这类单调上升序列的最大长度. 数据范围:1<=n<=10 ...

  4. nlogn 求最长上升子序列 LIS

    最近在做单调队列,发现了最长上升子序列O(nlogn)的求法也有利用单调队列的思想. 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]& ...

  5. 最长递减子序列(nlogn)(个人模版)

    最长递减子序列(nlogn): int find(int n,int key) { ; int right=n; while(left<=right) { ; if(res[mid]>ke ...

  6. 最长上升子序列LIS(51nod1134)

    1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递 ...

  7. 【部分转载】:【lower_bound、upperbound讲解、二分查找、最长上升子序列(LIS)、最长下降子序列模版】

    二分 lower_bound lower_bound()在一个区间内进行二分查找,返回第一个大于等于目标值的位置(地址) upper_bound upper_bound()与lower_bound() ...

  8. 洛谷1439:最长公共子序列(nlogn做法)

    洛谷1439:最长公共子序列(nlogn做法) 题目描述: 给定两个序列求最长公共子序列. 这两个序列一定是\(1\)~\(n\)的全排列. 数据范围: \(1\leq n\leq 10^5\) 思路 ...

  9. 一个数组求其最长递增子序列(LIS)

    一个数组求其最长递增子序列(LIS) 例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度, 需要一个额外 ...

  10. 2.16 最长递增子序列 LIS

    [本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...

随机推荐

  1. 直接插入排序(Straight Insertion Sort)

    直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. /* 对顺序表L作直接插入排序 */ void ...

  2. Java transientkeyword使用小记

    1. transient的作用及用法 我们都知道一个对象仅仅要实现了Serilizable接口,这个对象就能够被序列化,java的这样的序列化模式为开发人员提供了非常多便利.我们能够不必关系详细序列化 ...

  3. Constructor call must be the first statement in a constructor

    super()和this ()不能共存.否则编译时会报异常. Constructorcall must be the first statement in a constructor 换句话说就是su ...

  4. 【DNN 系列】 DNN是什么

    DNN平台 这个DNN平台是一个开放的.可扩展的.安全的.可扩展的内容管理系统和ASP.NET.世界各地的数十万商户,从地方小企业到全球1000强企业,取决于DNN平台作为他们网站的编辑环境. 这个网 ...

  5. AngularJs轻松入门(二)数据绑定

    数据绑定是AngularJs中非常重要的特性,我们看一下下面的例子: <!DOCTYPE html> <html ng-app> <head lang="en& ...

  6. 《剑指offer》二叉树的镜像

    一.题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 二.输入描述 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 三.输出描述 镜像二叉树 8 / \ 10 ...

  7. rem自适应布局-移动端自适应必备:flexible.js

    http://caibaojian.com/flexible-js.html

  8. linux上将另一个文件内容快速写入正在编辑的文件内

    一.我们看到 www 目录下有两个文件.like.php 内有一行字母,而 loo.php 内什么也没有. 二 .我们来编辑 loo.php. 三.用下面的命令将 like.php 的内容复制到 lo ...

  9. Vue不能检测的数组变化 对象变化

    数组: 由于 JavaScript 的限制,Vue 不能检测以下变动的数组: 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue 当你修改数组的长度时 ...

  10. NodeJS学习笔记 进阶 (7)express+session实现简易身份认证(ok)

    个人总结: 这篇文章讲解了express框架中如何使用session,主要用了express-session这个包.更多可以参考npm.js来看,读完这篇文章需要10分钟. 摘选自网络: 文档概览 本 ...