CF729E Solution
题解
可以发现\(a\)序列的目标状态一定是从\(0\)开始的连续的(\([0,k]\)间每个数均出现过)序列。因此用\(pos\)数组记录每个\(a_i\)值出现的次数,从前向后遍历每个员工。如果出现\(pos[i]=0\)则\(ans+1\),并从未统计的员工中选一个填补空缺,直至所有员工均被统计。此外,如果下标为\(a_s\not=0\),则需要将\(a_s\)变更为\(0\)。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],pos[N];
int main()
{
int n,s,ans=0,sum=1;
scanf("%d%d",&n,&s);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(i==s && a[i]!=0) ans++;
else pos[a[i]]++;
}
for(int i=1;sum<n;i++) {sum+=max(1,pos[i]); ans+=(!pos[i]);}
//a[s]=0的情况已处理,a[i]=0(i!=s)的情况被用来填补空缺,因此sum<n且i>=1
printf("%d",ans);
return 0;
}