最长上升子序列

来源:互联网 发布:淘宝待揽件是什么意思 编辑:程序博客网 时间:2024/06/12 21:52

问题 I(2486): 最长上升子序列

时间限制: 1 Sec  内存限制: 128 MB

题目描述

给出一个长度为N的整数序列,求出包含它的第K个元素的最长上升子序列。

输入

第一行两个整数N, K
第二行N个整数

输出

如题目所说的序列长度。

样例输入

(如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)

8 665 158 170 299 300 155 207 389

样例输出

4

提示

【数据范围】

0 < N ≤ 200000,0 < K ≤ N

上代码

#include<cstdio>#include<climits>int n,min,k,a[200005],f[200005]={INT_MIN};//用f[i]来表示长度为i的序列末尾最小值int main(){    scanf("%d %d",&n,&k);    for(int i=1;i<=n;i++)         scanf("%d",&a[i]);    for(int i=1;i<=n;i++)    {        if((i<k&&a[i]>=a[k])||(i>k&&a[i]<=a[k]))/*如果a[i]在a[k]的前面,就是i<k时并且比a[k]大或者是在a[k]的后面,就是i>k时并且比a[k]小就可以删除啦*/            continue;        if(a[i]>f[min])         {            f[++min]=a[i];//当它大于边界值时,就赋值给之后的数            continue;        }      int l=0,r=min,t=0;        while(l<=r)        {            int mid=(l+r)/2;            if(a[i]>f[mid])                 l=mid+1,t=mid;            else                r=mid-1;        }        if(f[t+1]>a[i])            f[t+1]=a[i];//使f[i]的值变成此轮循环的最小值    }    printf("%d\n",min);}


原创粉丝点击