传送门
这题前两个子任务比较简单,对于询问
n
,直接将最后扩展出来的点的深度,设为
后两个子任务,考虑原树的左子树有
j
个节点,右子树有
一开始想错了,以为
max(a,b)
的期望值就等于max(
a
的期望值,
这个题目告诉我们,某些函数的期望值,不止于各个变量的期望值有关,还跟各个变量的分布有关。
实在想不清这种期望题,就大力随机化吧,看人家虞皓翔,ZJOI2017Round就是这么怒艹十分的,比我这种指数暴力的菜鸡高到不知道哪里去。
洛谷上首发AC,可喜可贺。
bzoj上也只有21份AC代码,突然感觉我的代码好罕见啊
#include<cstdio>
namespace solver1{
int i;
long double ans;
long double main(int n){
for(i=2;i<=n;++i)ans+=2.0/i;
return ans;
}
}
int q,n;
long double ans;
inline int max(int a,int b){
return a>b?a:b;
}
namespace solver2{
int i,j,k,l,o;
long double f[105][105],ans;
long double main(int n){
f[1][0]=1;
f[2][1]=1;
f[3][2]=1;
for(i=4;i<=n;++i){
for(j=1;j<i;++j)
for(k=0;k<j;++k)
for(l=0;l<i-j;++l)f[i][max(k,l)+1]+=f[j][k]*f[i-j][l]/(i-1);
}
for(i=1;i<=n;++i)ans+=i*f[n][i];
return ans;
}
}
int main(){
scanf("%d%d",&q,&n);
if(q==1)ans=solver1::main(n);
else ans=solver2::main(n);
printf("%.6Lf\n",ans);
return 0;
}
upd:刚才去bzoj上交了一发,发现跑了96ms,达成成就->这题跑得最慢。