1 条题解

  • 1
    @ 2019-05-04 10:49:41

    很简单,用一个数组把a[k]左边比a[k]小的取出来,求LIS;
    再把a[k]右边比a[k]大的取出来,再求一次LIS;

    建议使用二分查找。

    当当前的数大于栈顶时,压入栈,否则,二分查找栈中比当前数大的最小数,替换。

    \(code:\)

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0' || c>'9'){if (c=='-')f=-1;c=getchar();}
        while (c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-48;c=getchar();}
        return x*f;
    }
    
    const int MAXN=300005;
    int n,k,cnt,ans;
    int a[MAXN],b[MAXN],f[MAXN];
    
    int find(int l,int r,int k)
    {
        int mid;
        while (l<r)
        {
            mid=(l+r)>>1;
            if (f[mid]>=k)r=mid;
            else l=mid+1;
        }
        return l;
    }
    
    int calc(int n,int c[MAXN])
    {
        memset(f,0,sizeof(f));
        int len=0,k;
        for (int i=1;i<=n;i++)
            if (c[i]>f[len])f[++len]=c[i];
            else f[k=find(1,len,c[i])]=min(f[k],c[i]);
        return len;
    }
    
    int main()
    {
        n=read();k=read();
        for (int i=1;i<=n;i++) a[i]=read();
        cnt=0;
        for (int i=1;i<k;i++)
            if (a[i]<a[k])b[++cnt]=a[i];
        ans+=calc(cnt,b);
        cnt=0;
        for (int i=k+1;i<=n;i++)
            if (a[i]>a[k])b[++cnt]=a[i];
        ans+=calc(cnt,b);
        printf("%d\n",ans+1);
        return 0;
    }
    
    
  • 1

信息

ID
1002
难度
8
分类
(无)
标签
(无)
递交数
11
已通过
2
通过率
18%
上传者