二分法优化后的模板:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int MAX=50000;
using namespace std;
int arr[MAX+50],ans[MAX+50],len;
int binary_search(int i)//手写二分法
{
int left,right,mid;
left=0,right=len;
while(left<right)
{
mid = left+(right-left)/2;
if(ans[mid]>=arr[i]) right=mid;
else left=mid+1;
}
return left;
}
int main()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)
cin>>arr[i];
ans[0] = arr[1];
len=0;
for(int i=2; i<=n; i++)
{
if(arr[i]>ans[len])
ans[++len]=arr[i];
else
{
int pos=binary_search(i);
//int pos=lower_bound(ans,ans+len,arr[i])-ans;//也可直接使用STL库里的函数
ans[pos] = min(ans[pos],arr[i]);
}
}
cout<<len+1<<endl;//数组大小就是最长上升子序列的个数
}