• cojs1101. [Vijos1369] 难解的问题==codevs 2188 最长上升子序列


     

    【题目描述】

      在你的帮助下,蔚蓝来到了埃及.在金字塔里,蔚蓝看到了一个问题,传说,能回答出这个问题的人就能受到埃及法老的祝福,可是蔚蓝日夜奋战,还是想不出来,你能帮帮他么?(XXX: 胡扯,教主怎么可能想不出来= _ =||)(WS这人说的=。=)
      问题是这样的: 
      给定一个序列<a1,a2,...,an>.求最长上升子序列(lis)p1<p2<...<pw满足a[p1]<a[p2]<...<a[pw]
        例如65 158 170 299 300 155 207 389
      LIS=<65,158,170,299,300,389>。
      但是,现在还有一个附加条件:求出的最长上升子序列必须含有第K项。
      比如,在上面的例子中,要求求出的最长上升子序列必须含有第6项,那么最长上升子序列就是:65 155 207 389。

    【输入格式】

    第一行是用空格隔开的两个正整数N、K,含义同上所述.
    第二行N个数,即给出的序列.

    【输出格式】

    仅有一个数,表示含有第K项的最长上升子序列的长度.

    【样例输入1】

    5 3
    1 2 3 2 1
    

    【样例输出1】

    3


    样例输入2 Sample Input

    8 6

    65 158 170 299 300 155 207 389

    样例输出2 Sample Output

    4

    【提示】

    对于60%的数据,N<=10000;
    对于100%的数据,1<=n<=300000 ,1<=k<=n,序列的每一个数为小于2^31-1 的非负整数.

    【来源】

    Super Pig(蔚蓝) http://vijos.org/Problem_show.asp?id=1369

    题解:

    很简单,只需把a[k]前面比a[k]大、后面比a[k]小的数剔除掉,生成新的a数组。

    nlogn的算法求一下 新的a数组 的最长上升子序列。

    AC代码:

    #include<cstdio>
    #include<iostream>
    using namespace std;
    #define N 1000010
    int T,n,k,len,a[N],b[N],c[N];
    inline int binary_search(int i){
        int l=1,r=len,mid;
        while(l<r){
            mid=l+(r-l>>1);
            if(b[mid]>=a[i]) r=mid;
            else l=mid+1;
        }
        return l;
    }
    int main(){
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++) scanf("%d",a+i);
        int count=0;
        for(int i=1;i<k;i++) if(a[i]<a[k]) c[++count]=a[i];c[++count]=a[k];
        for(int i=k+1;i<=n;i++) if(a[k]<a[i]) c[++count]=a[i];
        for(int i=1;i<=n;i++) a[i]=c[i];
        b[len=1]=a[1];
        for(int i=2;i<=count;i++){
            if(a[i]>b[len]){
                b[++len]=a[i];
            }
            else{
                int pos=binary_search(i);
                //int pos=lower_bound(b,b+len+1,a[i])-b;
                b[pos]=a[i];
            }
        }
        printf("%d
    ",len);
        return 0;
    }
  • 相关阅读:
    错位排序
    不容易系列之(4)——考新郎
    大数乘法
    神、上帝以及老天爷(错位排序)
    学生成绩……
    蛇形矩阵
    topcoder
    进制转换
    问题 1011
    topcoder 针对C程序员的TopCoder C++ (快速掌握)_ixigua—仅有杀毒软件是不够的…… .
  • 原文地址:https://www.cnblogs.com/shenben/p/5839268.html
Copyright © 2020-2023  润新知