二分求最长单调递增子序列并输出最长的序列(模板)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 100005
using namespace std;
int num[N];
int a[N];
int pre[N];
int pos[N];

void print(int x){
    if(x==0) return;
    print(pre[x]);
    cout<<num[x]<<" ";
}

int main(){
    int n;
    while(cin>>n){
        memset(a, 0x3f, sizeof(a));
        int len = 0;
        for(int i=1; i<=n; ++i){
            cin>>num[i];
            int ll = lower_bound(a, a+len, num[i]) - a;
            if(ll+1 > len) len = ll+1;
            a[ll] = num[i];//第ll个位置新插入的数字num[i]
            pos[ll] = i;//第ll个位置插入的是第i个数字
            if(ll-1>=0) pre[i] = pos[ll-1];//当前插入的第i个数字的在递增序列中的前一个数字是第几个!
        }
        print(pre[pos[len-1]]);
        cout<<(num[pos[len-1]])<<endl;
        cout<<len<<endl;
    }
    return 0;
}
时间: 2024-12-31 02:58:55

二分求最长单调递增子序列并输出最长的序列(模板)的相关文章

NY214&amp;#160;单调递增子序列(二)

单调递增子序列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给定一整型数列{a1,a2...,an}(0 如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5. 输入 有多组测试数据(<=7) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0 数据以EOF结束 . 输入数据保证合法(全为int型整数)! 输出 对于每组测试数据输出整

LIS 最长递增子序列 Java的简单实现_java

今天遇到了一个求最长递增子序列的问题,看了之后就尝试着用Java实现了一下,关于什么是最长递增子序列,这里就不在赘述,可以百度或者Google之,以下为实现的代码: 说明:本段代码实现的功能为 (1)随机生成一个有10个元素的数组,然后输出它的最长递增子序列 (2)输出以其中某一个元素为结尾的最长递增子序列的长度 具体的实现思路在注释中已经详细表明了,比较简单,这里就不再赘述 import java.util.Arrays; import java.util.Random; public cla

C语言实现最长递增子序列问题的解决方法_C 语言

本文实例展示了C语言实现最长递增子序列问题的解决方法.分享给大家供大家参考.具体方法如下: 问题描述: 给定一个序列,找出其最长递增子序列长度. 比如 输入 1 3 7 5 输出 3 算法解决思路: 利用动态规划的思想,以序列的每个点最为最右端,找出每个点作为最右端时的子序列长度的最大值,即问题的求解.因此,在计算前面的每个点的时候,将其结果保存下来,后面的点与前面的点的数值进行比较,如果大,则在其长度基础上加1,并且找出所有可能情况下最长的保存为当前点的长度.形成递归. 具体实现代码如下: #

求数组中最长递增子序列的解决方法_C 语言

存储扩展算法n2编程c 写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中的最长递增子序列的长度.例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长的递增子序列为1,2,4,6 或者 -1,2,4,6.(编程之美P198-202)分析与解法根据题目的要求,求一维数组中的最长递增子序列,也就是找一个标号的序列b[0],b[1],-,b[m](0 <= b[0] < b[1] < - < b[m] < N),使得array[b[0]]<array[b[1

最长递增子序列(LIS)的O(N^2)与O(NlogN)算法分析

题目: 求一个一维数组arr[n]中的最长递增子序列的长度,如在序列1,5,8,3,6,7中,最长递增子序列长度为4 (即1,3,6,7). 由于LIS用O(NlogN)也能打印,O(N^2)的DP方法见最后. 从LIS的性质出发,要想得到一个更长的上升序列,该序列前面的数必须尽量的小. 对于原序列1,5,8,3,6,7来说,当子序列为1,5,8时,遇到3时,序列已经不能继续变长了.但是,我们可以通过替换,使"整个序列"看上去更小,从而有更大的机会去变长.这样,当替换5-3和替换8-6

lintcode 最长上升连续子序列 II(二维最长上升连续序列)

题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最长上升连续子序列 II   给定一个整数矩阵(其中,有 n 行, m 列),请找出矩阵中的最长上升连续子序列.(最长上升连续子序列可从任意行或任意列开始,向上/下/左/右任意方向移动). 样例 给定一个矩阵 [ [1 ,2 ,3 ,4 ,5], [16,17,24,23,6], [15,18,25,22,7], [14

求解最长递增子序列长度|动态规划+二分查找:C\C++实现

01 /* 求解最长递增子序列长度 */ 02 #include <iostream> 03 #include <limits> 04   05 using namespace std; 06   07 //int x[] = {1,-1,2,-3,4,-5,6,-7}; 08 int x[] = {2, 1, 5, 3, 6, 4, 8, 9, 7}; 09 int disp_array(int a[], int len); 10 int find_first_bigger(in

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1.动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列.如果序列比较长,这种方法需要指数级时间,不切实际. LCS的最优子结构定理:设X={x1,x2,--,xm}和Y={y1,y2,--,yn}为两个序列,并设Z={z1.z2.--,zk}为X和Y的任意一个LCS,则:       (1

SQL计算字符串中最大的递增子序列的方法_mssql2005

求字符串中最大的递增子序列 数据库环境:SQL SERVER 2005 如题,求字符串"abcbklmnodfghijkmer"中最大的递增子序列.这个字符串有点特别, 只由26个小写字母a-z组成. 大概思路如下: 1.将字符串转到一列存储,并生成行号 2.设置一个递增计数器列,默认为1,比较上下行的字符,如果在字典中的顺序是递增, 则计数器加1,否则,计数器置1 3.找出计数器最大的数及对应的行号,根据这2个数截取字符串 思路有了,下面直接贴代码 DECLARE @vtext VA