天天看点

最长上升子序列 II

题目:

最长上升子序列 II
#include <bits/stdc++.h>
using namespace std;
const int N=5e5+10;
long long a[N],f[N];
int con;
int find(int x)
{
  int l=1,r=con;
  while(l<r)
  {
    int mid=l+r>>1;
    if(f[mid]>=x) r=mid;
    else l=mid+1;
  }
  return l;
}
int main()
{
  int n;
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    scanf("%lld",&a[i]);
  }
  
  f[++con]=a[1];
  for(int i=2;i<=n;i++)
  {
    if(a[i]>f[con])
    {
      f[++con]=a[i];
      
    }
    else
    {
      int t=find(a[i]);
      f[t]=a[i];
    }
  }
  cout<<con<<endl;
  return 0;
}      

继续阅读