提交:codevs3955
题目↑↑
这道题是最长上升子序列的加强版,这道题的数据比一般的最长上升子序列要大,所以一般的算法O(n^2)会超时
所以这道题用一种贪心算法(师兄讲评)
这种算法的时间复杂度为O(n logn)
代码↓↓
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int b[1100000];
int erfen(int l,int r,int d)
{
int mid,ans;
while(l<=r)
{
mid=(l+r)/2;
if(b[mid]>=d)
{
r=mid-1;
ans=mid;
}
else
{
l=mid+1;
}
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
int len=0;
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
if(x>b[len]||len==0)
{
b[++len]=x;
}
else
{
int tt=erfen(1,len,x);
b[tt]=min(x,b[tt]);
}
}
printf("%d\n",len);
return 0;
}