Codeforces 1045D Interstellar battle
作者:互联网
对于每个联通块的贡献我们把它放到深度最低的那个点上面去。
那么一个点有贡献就是它的父亲被摧毁了并且自己没有被摧毁。
然后把所有概率加起来就是期望了。
#include<bits/stdc++.h> using namespace std; const int N = (int)1e5 + 7; int n; double p[N]; double ans; double sum[N]; int pa[N]; vector<int> G[N]; void dfs(int u, int fa) { pa[u] = fa; ans += p[fa] * (1 - p[u]); for(auto v : G[u]) { if(v == fa) continue; dfs(v, u); sum[u] += 1 - p[v]; } } int main() { p[0] = 1; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%lf", &p[i]); for(int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); u++; v++; G[u].push_back(v); G[v].push_back(u); } dfs(1, 0); int q; scanf("%d", &q); while(q--) { int u; double x; scanf("%d%lf", &u, &x); u++; if(pa[u]) sum[pa[u]] -= 1 - p[u]; ans -= (1 - p[u]) * p[pa[u]]; ans -= p[u] * sum[u]; p[u] = x; if(pa[u]) sum[pa[u]] += 1 - p[u]; ans += (1 - p[u]) * p[pa[u]]; ans += p[u] * sum[u]; printf("%.12f\n", ans); } return 0; } /* */
标签:int,double,Interstellar,dfs,Codeforces,fa,ans,battle 来源: https://www.cnblogs.com/CJLHY/p/11687528.html