LIS(模板)

贪心+二分
显然其结尾元素越小,越有利于在后面接其他的元素,也就越可能变得更长
所以我们不断更新(答案)序列中元素,使之更有利于后面答案

#include<bits/stdc++.h>
#define re return
#define inc(i,l,r) for(int i=l;i<=r;++i)
const int maxn=100005,maxm=2005;
using namespace std;
template<typename T>inline void rd(T&x)
{
    char c;bool f=0;
    while((c=getchar())<'0'||c>'9')if(c=='-')f=1;
    x=c^48;
    while((c=getchar())>='0'&&c<='9')x=x*10+(c^48);
    if(f)x=-x;
}

int f[maxn],k,n;

int main()
{
    int x;
    rd(n);
    inc(i,1,n)
    {
        rd(x);
        if(x>f[k])f[++k]=x;
        else
        {
            int l=1,r=k;
            while(l<=r)
            {
                int mid=(l+r)>>1;
                if(f[mid]<x)l=mid+1;
                else r=mid-1;
            }
            
            f[l]=x;
        } 
    }
    printf("%d",k);
}

猜你喜欢

转载自www.cnblogs.com/lsyyy/p/11285519.html
lis