VIJOS-P1369 难解的问题

来源:互联网 发布:windows 32位 64位 编辑:程序博客网 时间:2024/04/29 03:28

https://vijos.org/p/1369

预处理:将 k 前大于num[k]的删掉,将 k 后小于num[k]的删掉
然后 nlogn最长上升子序列

#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;int n,k;int num[300005];int b[300005],cnt;int main(){    scanf("%d%d",&n,&k);    int i;    for(i=1;i<=n;i++)    {        scanf("%d",&num[i]);    }    for(i=1;i<k;i++)    {        if(num[i]>=num[k]) num[i]=-1;    }    for(i=k+1;i<=n;i++)    {        if(num[i]<=num[k]) num[i]=-1;    }    b[0]=-1<<30;    for(i=1;i<=n;i++)    {        if(num[i]==-1) continue;        if(num[i]>b[cnt]) b[++cnt]=num[i];        else        {            int pos=lower_bound(b+1,b+cnt+1,num[i])-b;            b[pos]=num[i];        }    }    printf("%d",cnt);    return 0;}/*10 71 7 2 7 1 1 3 6 5 5///////////5 30 0 0 0 0*/
0 0