预处理:将 k 前大于num[k]的删掉,将 k 后小于num[k]的删掉
然后 nlogn最长上升子序列
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n,k;
int num[300005];
int b[300005],cnt;
int main()
{
scanf("%d%d",&n,&k);
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
for(i=1;i<k;i++)
{
if(num[i]>=num[k]) num[i]=-1;
}
for(i=k+1;i<=n;i++)
{
if(num[i]<=num[k]) num[i]=-1;
}
b[0]=-1<<30;
for(i=1;i<=n;i++)
{
if(num[i]==-1) continue;
if(num[i]>b[cnt]) b[++cnt]=num[i];
else
{
int pos=lower_bound(b+1,b+cnt+1,num[i])-b;
b[pos]=num[i];
}
}
printf("%d",cnt);
return 0;
}
/*
10 7
1 7 2 7 1 1 3 6 5 5
///
5 3
0 0 0 0 0
*/