…………我……手贱………………特么……忘了……我的队列…………下标是从……0开始的…………拍了……5k组…………没出错…………………………出题人造数据辛苦了233333
显然最坏情况是 初始节点在叶子上 然后直接xjbdp一下
#include<bits/stdc++.h>
#define MAXN 700005
using namespace std; int n , k;
inline int read(){
register char ch = getchar();
while(!isdigit(ch)) ch = getchar();
register int rtn = 0;
while(isdigit(ch)) rtn = rtn*10 + ch - '0' , ch = getchar();
return rtn;
}
//======
int fth[MAXN],siz[MAXN];
int dex[MAXN];
double f[MAXN];
int que[MAXN] , head , tail ;
int main(){
n = read() , k = read();
for(int i=1;i<=n;++i) siz[i] = 1;
for(int i=2;i<=n;++i) fth[i] = read() , ++dex[fth[i]];
for(int i=1;i<=n;++i) if(!dex[i]) que[tail++] = i , f[i] = 1;
int now;
while(head^tail){
now = que[head++];
if(!(--dex[fth[now]])) que[tail++] = fth[now];
siz[fth[now]] += siz[now];
}
for(int i=0;i<n;++i){
int now = que[i];
f[fth[now]] = max(f[fth[now]],min((double)siz[now]/(double)(siz[fth[now]]-1),f[now]));
}
double ans = 0;
for(int i=1;i<=n;++i)
if(siz[i] > k)
ans = max(ans,f[i]);
if(ans < 0.000000001) return puts("0"),0;
printf("%.10lf\n",ans);
return 0;
}