最长上升子序列(LIS)nlogn模板
参考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模板的更多相关文章
- 动态规划——最长上升子序列LIS及模板
LIS定义 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1 ...
- 最长上升子序列 LIS nlogn
给出一个 1 ∼ n (n ≤ 10^5) 的排列 P 求其最长上升子序列长度 Input 第一行一个正整数n,表示序列中整数个数: 第二行是空格隔开的n个整数组成的序列. Output 最长上升子序 ...
- AT2827 最长上升子序列LIS(nlogn的DP优化)
题意翻译 给定一长度为n的数列,请在不改变原数列顺序的前提下,从中随机的取出一定数量的整数,并使这些整数构成单调上升序列. 输出这类单调上升序列的最大长度. 数据范围:1<=n<=10 ...
- nlogn 求最长上升子序列 LIS
最近在做单调队列,发现了最长上升子序列O(nlogn)的求法也有利用单调队列的思想. 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]& ...
- 最长递减子序列(nlogn)(个人模版)
最长递减子序列(nlogn): int find(int n,int key) { ; int right=n; while(left<=right) { ; if(res[mid]>ke ...
- 最长上升子序列LIS(51nod1134)
1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递 ...
- 【部分转载】:【lower_bound、upperbound讲解、二分查找、最长上升子序列(LIS)、最长下降子序列模版】
二分 lower_bound lower_bound()在一个区间内进行二分查找,返回第一个大于等于目标值的位置(地址) upper_bound upper_bound()与lower_bound() ...
- 洛谷1439:最长公共子序列(nlogn做法)
洛谷1439:最长公共子序列(nlogn做法) 题目描述: 给定两个序列求最长公共子序列. 这两个序列一定是\(1\)~\(n\)的全排列. 数据范围: \(1\leq n\leq 10^5\) 思路 ...
- 一个数组求其最长递增子序列(LIS)
一个数组求其最长递增子序列(LIS) 例如数组{3, 1, 4, 2, 3, 9, 4, 6}的LIS是{1, 2, 3, 4, 6},长度为5,假设数组长度为N,求数组的LIS的长度, 需要一个额外 ...
- 2.16 最长递增子序列 LIS
[本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...
随机推荐
- Linux平台不同解压缩命令的使用方法
作者:郭孝星 微博:郭孝星的新浪微博 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.co ...
- LBP(Local Binary Patterns)局部二进制模式
1. LBP 用于人脸识别 为了预测每个像素属于哪个脸部器官(眼睛.鼻子.嘴.头发),通常的作法是在该像素周围取一个小的区域,提取纹理特征(例如局部二值模式),再基于该特征利用支持向量机等浅层模型分类 ...
- 33.AngularJS 应用 angular.module定义应用 angular.controller控制应用
转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS 模块(Module) 定义了 AngularJS 应用. AngularJS 控制器(Co ...
- OpenGL的前世和今生
这并不是一个恰当的题目,因为我主要想说的是OpenGL的今生,基于OpenGL3.x一种更现代化的方式.但是把前世和今生放在一起在语言上更加连贯,而且适当的了解过去,会帮助理解现在的OpenGL,以一 ...
- WHERE、ORDER BY、GROUP BY、HAVING语句解析(二十八)
之前啊,我们提及到,对于update和delete,若不带where条件,则对所有记录都有效. 一.WHERE条件表达式 (1)对记录进行过滤,如果没有指定WHERE子句,则显示所有记录. (2)在W ...
- OpenGL编程逐步深入(八)伸缩变换
准备知识 伸缩变换非常简单,它的目的是增大或者缩小对象的尺寸.例如:你可能希望用同一个模型创建不同大小的对象(例如形状相同,但大小不同的树木)或者你想改变对象的大小使它和游戏场景匹配.这些例子中你可能 ...
- PHP——下载图片到本地代码
<?php //获取网页图片 $url = "http://qlogo2.store.qq.com/qzone/393183837/393183837/50"; $curl ...
- The IDL compiler
The IDL compiler or bindings generator transcompiles Web IDL to C++ code, specifically bindings betw ...
- GPU Command Buffer
For Developers > Design Documents > GPU Command Buffer This are mostly just notes on the ...
- pycaffe 可视化常用
net.params['layername'].[0]/[1] caffe的一个程序跑完之后会在snapshot所指定的目录下产生一个后缀名为caffemode的文件,这里存放的就是我们在训练网络的时 ...