最长上升子序列(LCS) 模板
复杂度 o(nlog(n))

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
void Binary_Insert(int ar[],int &len,int x)
{
    if(x > ar[len-1])
    {
        ar[len] = x;
        len++;
        return ;
    }
    int l = 0,r = len-1;
    int mid;
    while(r >= l)
    {
         mid = l + ((r-l)>>1);
        if(ar[mid] > x)
            r = mid-1;
        else
            l = mid+1;
    }
    ar[l] = x;
}
template  <class It>
int n_lisLength(It begin,It end)
{
    typedef typename iterator_traits<It>::value_type T;
    T inf = 1<<30;
    vector<T> best(end-begin,inf);
    for(It i = begin; i != end; ++i)
       *lower_bound(best.begin(),best.end(),*i) = *i;
    return lower_bound(best.begin(),best.end(),inf) - best.begin();

}

int main () {

  cout<<(!!0)<<endl;
  int br[10] = {0,2,3,1,7,8,9,6,5,4};
  cout<<n_lisLength(br,br+10)<<endl;
  int ar[1000];
  int len = 1;
  for(int i = 0;i <= 10; ++i)
      ar[i] = 1000;
   ar[0] = br[0];
  for(int i = 1;i < 10; ++i)
     Binary_Insert(ar,len,br[i]);
  for(int i = 0;i < len; ++i)
     cout<<ar[i]<<" ";

  return 0;
}