• 解题:SHOI 2014 概率充电器


    题面

    显然就是在求概率,因为期望乘的全是1.。。。然后就推推推啊

    设$fgg[i]$表示这个点父亲没给他充上电的概率,$sgg[i]$表示这个点子树(和它自己)没给他充上电的概率,然后这个点没充上电的概率就是$fgg[i]*sgg[i]$

    我们发现我们在树上转移的话$fgg$是依赖自己的$sgg$向儿子转移的,那我们先把$sgg$求出来,下面设$suc[i]$表示$i$这个点充上电的概率,$lnk[i][j]$表示连接$i$和$j$的导线能通电的概率

    $sgg[i]=(1-suc[i])prod_{g∈son_i}(sgg[g]+(1-sgg[g])*(1-lnk[i][g]))$

    就是说首先自己不能充电,同时儿子也都不能给自己充电。所以每个儿子要么自己不能充电(这时不管导线),要么能充电但是导线坏了,我们为了下面方便写不妨对每个儿子记录下这个儿子g gg的概率$p[g]$(即$(sgg[g]+(1-sgg[g])*(1-lnk[i][g]))$这一坨)

    然后求$fgg$,这里我们先把每个点针对每个儿子$g$时自己不能给儿子充电的概率$P$求出来

    $P=fgg[nde]*sgg[nde]/p[g]$

    (在儿子g gg的所有情况$p[g]$中,因为父亲节点gg的原因有$fgg[nde]*sgg[nde]$这么多)

    然后和上面一样可以求出来$fgg[g]$

    $fgg[g]=P+(1-P)*(1-lnk[i][g])$

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 const int N=500005,M=1e6+60;
     6 int p[N],noww[M],goal[M],n,t1,t2,cnt; 
     7 double val[M],pos[N],sgg[N],fgg[N],mem[N],t3,ans;
     8 void Link(int f,int t,double v)
     9 {
    10     noww[++cnt]=p[f],p[f]=cnt;
    11     goal[cnt]=t,val[cnt]=v;
    12 }
    13 void Gettre(int nde,int fth)
    14 {
    15     sgg[nde]=1-pos[nde];
    16     for(int i=p[nde];i;i=noww[i])
    17         if(goal[i]!=fth)
    18         {
    19             int g=goal[i]; Gettre(g,nde);
    20             mem[g]=sgg[g]+(1-sgg[g])*(1-val[i]);
    21             sgg[nde]*=mem[g];
    22         }
    23 }
    24 void Getans(int nde,int fth)
    25 {
    26     ans-=sgg[nde]*fgg[nde]; 
    27     for(int i=p[nde];i;i=noww[i])
    28         if(goal[i]!=fth)
    29         {
    30             int g=goal[i];
    31             double fag=sgg[nde]*fgg[nde]/mem[g];
    32             fgg[g]=fag+(1-fag)*(1-val[i]),Getans(g,nde);
    33         }
    34 }
    35 int main()
    36 {
    37     scanf("%d",&n),ans=n;
    38     for(int i=1;i<n;i++)
    39     {
    40         scanf("%d%d%lf",&t1,&t2,&t3);
    41         Link(t1,t2,t3/100),Link(t2,t1,t3/100);
    42     }
    43     for(int i=1;i<=n;i++)
    44         scanf("%lf",&pos[i]),pos[i]/=100;
    45     Gettre(1,0),fgg[1]=1,Getans(1,0),printf("%.6f",ans);
    46     return 0;
    47 }
    View Code
  • 相关阅读:
    windows下面安装Python和pip教程
    Python已安装第三方库
    Python安装cx_Oracle第三方库(Mac osx Yosemite Intel i5环境)
    7.Python进阶_函数对象
    6.Python进阶_循环对象
    5.Python进阶_循环设计
    UltraEdit中粘贴问题
    UltraEdit的代码片的编码设置
    使用C#实现SSLSocket加密通讯 Https
    sql while 循环要加begin end
  • 原文地址:https://www.cnblogs.com/ydnhaha/p/10283636.html
Copyright © 2020-2023  润新知