CF729E 题解
题目分析
这是一道思维题。
首先我们要找到这道题的突破口,即比较特殊的人——主管。
主管一定没有上司,那么回答 \(0\) 的就会有两种人:回答错误的人或主管。
接着我们再看其他员工的上司。由于员工之间的关系构成了一棵树,所以一个员工的上司数量一定只比他父亲(直接上司)的上司数量多 \(1\)。
那么不难推出这个数列的性质:
-
只有一个 \(0\)(主管)。
-
数列必须是连续的。
然后就开始找,一旦发现没有连续的部分,直接把最大的数填进去就可以了。
贴上代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int n,s;
int x;
int bot[maxn];
int cnt,ans;
inline void init(){
cin>>n>>s;cnt=1;
for(register int i=1;i<=n;++i){
cin>>x;
if(x>0&&i==s) ans++;
else bot[x]++;
}
}
int main(){
init();
for(register int i=1;cnt<=n-1;++i){
if(bot[i]==0) cnt++;
else cnt+=bot[i];
if(bot[i]==0) ans++;
}
cout<<ans;
}