#include<bits/stdc++.h>
using namespace std;
#define N 100005
int n,m;
int a[N],l[N],r[N],f[N],d[N];
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
{
cin>>a[i];
l[i]=1;
r[i]=1;
}
if(n==1)
{
cout<<0;
return 0;
}
f[1]=a[1];
l[1]=1;
int len=1;
for(int i=2; i<=m-1; i++)
{
if(f[len]<=a[i])
{
f[++len]=a[i];
}
else
{
f[lower_bound(f+1,f+len+1,a[i])-f]=a[i];//lower_bound 从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。以前讲过
}
l[i]=len;
}
int lens=1;
d[1]=a[n];
for(int i=n-1; i>=m+1; i--)
{
if(d[lens]<=a[i])
{
d[++lens]=a[i];
}
else
{
d[lower_bound(d+1,d+1+lens,a[i])-d]=a[i];
}
r[i]=lens;
}
int ans=n-1-l[m-1]-r[m+1];
if(m==1&&d[lens]>a[1])
{
ans++;
}
else if(m==n&&f[len]>a[n])
{
ans++;
}
else
{
if(a[m]<f[len]||a[m]<d[lens])
{
ans++;
}
}
cout<<ans;
return 0;
}
牛客oi c部落
于 2023-05-30 21:49:57 首次发布