Luogu U186790 昂首,足踏烈焰
题意
黑蛇老爷子想要进攻蓝门,但是核心城顶楼的地道太过复杂导致他迷路了。
核心城可以看做是一棵树。
黑蛇老爷子最开始会在节点 \(1\) ,而蓝门处在节点 \(goal\) 处。黑蛇老爷子会按照以下方式行动:
设当时是在节点 \(x\) ,假如现在有仍未到达过的子节点,那么黑蛇老爷子会随机选择一个这个节点未到达的的子节点 \(r\) ,消耗 \(1\) 个单位的时间从节点 \(x\) 到 \(r\) 。
否则,黑蛇老爷子会消耗 \(1\) 个单位的时间返回这个节点的父节点。
当黑蛇老爷子到达蓝门时就会停止移动。
现在,黑蛇老爷子想知道他到达蓝门的期望时间。由于黑蛇老爷子人老了想不动了于是他找到了博士让博士帮他算一算并答应事成之后给博士塔露拉主题的本子一本。
节点总数 \(n \le 3×10^4\) ,时限 \(208ms\) 。
题解
树 上 期 望 D P 绝 世 好 题
这里按照我做出来这题的思路顺序来吧,太初生了这题。。。。。。
考虑后代中没有终点的一个节点,那么如果来到了这个节点就一定会遍历完这个子树,所以所有形如这样的节点都可以将其子树缩成一个点,这个点的贡献为其子树大小乘二(进入节点产生一次贡献,出来也要产生一次),即 a[x]=siz[x]*2
。
然后考虑沿着后代有终点的节点走,显然这是一条从根到终点的路径。那么就需要计算每个节点“走歪路”的期望耗时。
题目中说了是随机选择未到达的子节点,也就意味着遍历顺序是一个其子节点的排列。而排列存在一个这样的性质:排列中任意两个不同的元素 x,y ,x 在排列中的位置在 y 之前的概率为二分之一。
也就意味着,每个后代无终点的节点的贡献为 a[x]÷2
,也就是 siz[x]
。
……?
那么后代有终点的呢?由于遍历这个子树的时候一定不会往回走了,并且一定会往这个子树走,所以它的贡献是 1
。至于终点,其子树一定不会被遍历到,所以不会产生贡献。
……?
把两个加起来?
最终的答案是?
n-siz[goal]
。
。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
出题人,我要杀你,一百遍都不够!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
太失望咧,对得起我思考这么久吗???!!!!???????????????????!!!!!!!!!!!!!!!
这个 \(n^2\) 的范围你知道我在想什么吗?!我在想tm容斥!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rnm,退钱!!!
代码
const ll maxn=3e4+5;
ll a[maxn];
ll n,k;
ll siz[maxn];
vector<ll>e[maxn];
void dfs(ll x,ll fa){
siz[x]=1;
for(auto v:e[x]){
if(v==fa)continue;
dfs(v,x);
siz[x]+=siz[v];
}
if(x==k){
n-=siz[x]-1;
}
}
void solve(){
n=R,k=R;
for(ll i=1;i<n;i++){
ll x=R,y=R;
e[x].push_back(y);
e[y].push_back(x);
}
dfs(1,0);
//db ans=work(1,0);
printf("%.1lf\n",1.0*n);
return ;
}