入门LIS。
练习题
#include<iostream>
using namespace std;
const int MAXN=300005;
struct Node
{
long long int num;
};
Node dp[MAXN];
int main()
{
int n,k,top=0,len=0;
long long int temp;
cin>>n>>k;
dp[0].num=-1;
for(int i=1;i<=k;i++)
{
cin>>temp;
if(temp>dp[top].num)
{
dp[++top].num=temp;
if(i==k)
{
len=top;
}
}
else
{
int l=1,r=top,mid;
while(l<=r)
{
mid=(l+r)/2;
if(temp>dp[mid].num)
{
l=mid+1;
}
else
{
r=mid-1;
}
}
dp[l].num=temp;
if(i==k)
{
len=l;
}
}
}
dp[1].num=temp;
top=1;
for(int i=k+1;i<=n;i++)
{
cin>>temp;
if(temp>dp[top].num)
{
dp[++top].num=temp;
}
else
{
int l=1,r=top,mid;
while(l<=r)
{
mid=(l+r)/2;
if(temp>dp[mid].num)
{
l=mid+1;
}
else
{
r=mid-1;
}
}
if(l!=1)
{
dp[l].num=temp;
}
}
}
len=len+top-1;
cout<<len<<endl;
return 0;
}