导弹拦截

题面

最长单调上升子序列

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[1000000];
int z[1000000];
int lowbit(int x)
{
    return x&-x;
}
int big;
inline int ask(int x)
{
    int r=0;
    for(int i=x;i>0;i-=lowbit(i))
        r=max(r,f[i]);
    return r;
}
inline void add(int x,int v)
{
    for(int i=x;i<=big;i+=lowbit(i))
        f[i]=max(f[i],v);
}
inline int que(int x)
{
    int r=0;
    for(int i=x;i<=big;i+=lowbit(i))
        r=max(r,f[i]);
    return r;
}
inline void psh(int x,int v)
{
    for(int i=x;i>0;i-=lowbit(i))
        f[i]=max(f[i],v);
}
int tot;
int a[1000000];
int ans;
int main()
{
    tot=1;
    while(scanf("%d",&a[tot])!=EOF)
    {
        big=max(big,a[tot]);
        z[tot]=a[tot];
        tot++;
    }
    tot--;
    for(int i=1;i<=tot;i++)
    {
        int x=ask(a[i])+1;
        ans=max(ans,x);
        add(a[i]+1,x);
    }
    memset(f,0,sizeof(f));
    int num=0;
    for(int i=1;i<=tot;i++)
    {
        int x=que(a[i])+1;
        num=max(num,x);
        psh(a[i],x);
    }
    printf("%d\n%d",num,ans);
    return 0;
}

  

posted @ 2019-07-15 14:05  [jackeylove]  阅读(155)  评论(0编辑  收藏  举报