最长上升子序列 LIS nlogn
给出一个 1 ∼ n (n ≤ 10^5) 的排列 P
求其最长上升子序列长度
Input
第一行一个正整数n,表示序列中整数个数;
第二行是空格隔开的n个整数组成的序列。
Output
最长上升子序列的长度
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<cstring>
const int MAXN=;
using namespace std;
struct tree{
int l,r,ma;
}a[*MAXN];
int dp[MAXN],n,ans=,nn=;
int lian[MAXN]; void cl(){
memset(dp,,sizeof(dp));
memset(lian,,sizeof(lian));
} void build(int id,int l,int r){
if(l==r){
a[id].l=l;
a[id].r=r;
a[id].ma=;
return;
}
a[id].l=l;
a[id].r=r;
int mid=(l+r)/;
build(id*,l,mid);
build(id*+,mid+,r);
a[id].ma=max(a[id*].ma,a[id*+].ma);
} int kanxun(int id,int l,int r){
int L=a[id].l,R=a[id].r,mid=(L+R)/;
if(l==L&&r==R){
return a[id].ma;
}
if(r<=mid) return kanxun(id*,l,r);
if(l>mid) return kanxun(id*+,l,r);
else return max(kanxun(id*,l,mid),kanxun(id*+,mid+,r));
} void insert(int id,int aum,int x){
int l=a[id].l,r=a[id].r,mid=(l+r)/;
if(l==r&&l==aum){
a[id].ma=x;
return;
}
if(aum<=mid) insert(id*,aum,x);
else insert(id*+,aum,x);
a[id].ma=max(a[id*].ma,a[id*+].ma);
} int main(){
cl();
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&lian[i]),nn=max(nn,lian[i]);
dp[]=;
build(,,nn);
for(int i=;i<=n;i++){
int j;
if(lian[i]==) j=;
else j=kanxun(,,lian[i]-);
dp[i]=j+;
insert(,lian[i],dp[i]);
}
for(int i=;i<=n;i++) ans=max(ans,dp[i]);
printf("%d",ans);
}
鬼畜版:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
using namespace std;
int dp[];
int main(){
memset(dp,,sizeof(dp));
int n,maxi=,l,r,mid,ans=;
scanf("%d",&n);
for(int i=;i<=n;i++){
int x;
scanf("%d",&x);
l=,r=maxi,ans=;
while(l<=r){
mid=(l+r)/;
if(x>=dp[mid]) ans=mid,l=mid+;
else r=mid-;
}
if(ans==maxi) dp[++maxi]=x;
else dp[ans+]=min(dp[ans+],x);
}
printf("%d",maxi);
return ;
}
最长上升子序列 LIS nlogn的更多相关文章
- 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的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递 ...
- 洛谷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就 ...
- 动态规划(DP),最长递增子序列(LIS)
题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(d ...
- 【部分转载】:【lower_bound、upperbound讲解、二分查找、最长上升子序列(LIS)、最长下降子序列模版】
二分 lower_bound lower_bound()在一个区间内进行二分查找,返回第一个大于等于目标值的位置(地址) upper_bound upper_bound()与lower_bound() ...
随机推荐
- 未能加载文件或程序集“Renci.SshNet, Version=2016.1.0.0, Culture=neutral, PublicKeyToken=……”
emmmm~ 这是一个让人烦躁有悲伤的问题~ 背景 我也不知道什么原因,用着用着,正好好的,就突然报了这种问题~ 未能加载文件或程序集“Renci.SshNet, Version=2016.1.0.0 ...
- rocketmq学习(一) rocketmq介绍与安装
1.消息队列介绍 消息队列本质上来说是一个符合先进先出原则的单向队列:一方发送消息并存入消息队列尾部(生产者投递消息),一方从消息队列的头部取出消息(消费者消费消息).但对于一个成熟可靠的消息队列来说 ...
- web性能优化实践
一.SQL查询优化 1.循环中有多次查询sql,改为在循环外一次查询后再处理 2.循环多次插入,改为组装好数据后批量插入 3.梳理业务逻辑能一次查完的,绝不分多次查 4.索引用起来 5.分页查询 二. ...
- 使用python合并excel
当工作碰到需要将几个excel合并时,比如一个表,收集每个人的个人信息,陆续收回来就是十几张甚至几十张表,少了还好解决,但是很多的话就不能一个一个去复制了,这时候就想到了python,Python大法 ...
- JavaScript之数学对象Math
Javascript 中Math和其他对象不同,它具有数学常数和函数的属性和方法.因为它的属性是数学常数,所以不能被改变(可以进行赋值操作,但最后值不变). Math的方法就是普通函数,调用他们直接用 ...
- Linux初识之VMWare中Centos7的安装
Windows平台下VMWare 14安装Centos 7 一.虚拟机硬件配置 1.选择创建新的虚拟机: 2.选择自定义(高级)进行自定义配置,单击下一步: 3.选择虚拟机硬件兼容性为默认,单击下一步 ...
- 【linux】【PostgreSQL】PostgreSQL安装
前言 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统.POSTGR ...
- numpy库使用总结
numpy study 0x01:n维数组对象ndaarray 存放同类型元素的多维数组 0x02:numpy数据类型 numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 ...
- linux添加默认网关
运维常用linux命令整理 1.临时添加 route add default gw 192.168.1.4 2.永久添加 vim /etc/sysconfig/network GATEWAY=192. ...
- 我用阿里云的虚拟云主机,也能配置https加密吗?
我用阿里云的虚拟云主机,也能配置https加密吗?答案是YES. 整个过程比想象中还要简单,都是一些基本的配置,虚拟主机 Web托管都可以很容易的搞定https. 首先我们要了解一下,阿里云是怎么支持 ...