[BZOJ3566][SHOI2014]概率充电器

博客围绕SHOI概率充电器展开,该充电器由导线连通充电元件,充电情况由概率决定。题目要求计算进入充电状态的元件个数的期望。博主最初思路遇阻,后给出题解,考虑将父亲对儿子和儿子对父亲分开,用两个数组通过两边dfs求解,还提及记录不被点亮概率的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器:
“采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器,您生活不可或缺的必需品!能充上电吗?现在就试试看吧!”
SHOI 概率充电器由 n-1 条导线连通了 n 个充电元件。进行充电时,每条导线是否可以导电以概率决定,每一个充电元件自身是否直接进行充电也由概率决定。
随后电能可以从直接充电的元件经过通电的导线使得其他充电元件进行间接充电。
作为 SHOI 公司的忠实客户,你无法抑制自己购买 SHOI 产品的冲动。在排了一个星期的长队之后终于入手了最新型号的 SHOI 概率充电器。
你迫不及待地将 SHOI 概率充电器插入电源——这时你突然想知道,进入充电状态的元件个数的期望是多少呢?

输入格式

第一行一个整数:n。概率充电器的充电元件个数。充电元件由 1-n 编号。
之后的 n-1 行每行三个整数 a, b, p,描述了一根导线连接了编号为 a 和 b 的充电元件,通电概率为 p。
第 n+2 行 n 个整数:qiq_iqi​​。表示 i 号元件直接充电的概率为 qi。

输出格式

输出一行一个实数,为进入充电状态的元件个数的期望,四舍五入到六位小数

样例
样例输入
3 
1 2 50 
1 3 50 
50 0 0
样例输出
1.000000
数据范围与提示

对于 100%的数据,n500000,0p,qi100。

  真的是个神题,学到了。读完题后很明显是树形概率dp,然而父亲儿子会相互影响,dp有后效性……然后我又想到了高斯消元,首先数据范围太大肯定不是正解,然后也不容易实现,就放弃了,打了个错解过了样例,拿了5分。(其实直接输出n可以拿10分的……)

【题解】  

  其实可以考虑把父亲对儿子和儿子对父亲分开考虑(T3也是两个数组dp的)。设f1[i]i被自己或儿子点亮的概率。f2[i]i被父亲点亮的概率;那么可以两边dfs分别求解两个数组。f1[叶子节点]=q[i]f1[i]=q[i]+

  注:这里的加为概率加法,和容斥类似,P(a+b)=P(a)+P(b)-P(a)*P(b);对于i,若直接加,则多加了i即被自己点亮又被儿子点亮的情况。  

 

  f2[根节点]=f1[i];pfa为父亲节点下传的概率,由于f2是有上向下更新,所以f2[fa]已知,pfa=f2[fa]-f1[v]*p()//解释:fa已经点亮,则有两种情况1.fav点亮,2.fa不被v点亮。

 

所以用fa亮的概率减去fav点亮的概率就是fa下传的概率(这里是概率相减,P(A)=(P(A+B)-P(B))/(1-P(B)))。f2[v]=f1[v]+pfa*p();这里也是概率加法,排除v既是自己亮又被fa点亮的情

 

况。

 

  

  

Ps.还有一种方法记录的是不被点亮的概率,避免了概率的加减(其实我觉得这个也挺好理解的)。

 

#include<iostream>
#include<cstdio>
#include<cmath>
#define esp (1e-13)
using namespace std;
struct edge
{
    int u,v,next;double p;
    #define u(x) ed[x].u
    #define v(x) ed[x].v
    #define n(x) ed[x].next
    #define p(x) ed[x].p
}ed[1000010];
int first[500010],num_e;
#define f(x) first[x]

int n;
double q[500010];
double f1[500010],f2[500010];

void dfs1(int x,int ff)
{
    if(!f(x)){f1[x]=q[x];return;}
    f1[x]=q[x];
    for(int i=f(x);i;i=n(i))
    if(v(i)!=ff)
    {
        dfs1(v(i),x);
        f1[x]=f1[x]+f1[v(i)]*p(i)-f1[x]*f1[v(i)]*p(i);//注 
    }
}
void dfs2(int x,int ff)
{
    double pfa=0;
    for(int i=f(x);i;i=n(i))
    if(v(i)!=ff)
    {
        if(fabs((1.0-f1[v(i)]*p(i))<esp))f2[v(i)]=1.0;
        else
        {
            pfa=(f2[x] - f1[v(i)]*p(i))/(1.0-f1[v(i)]*p(i));//注 
            f2[v(i)]=f1[v(i)]+p(i)*pfa-f1[v(i)]*pfa*p(i);//注 
        }
        dfs2(v(i),x);
    }
}
inline void add_e(int u,int v,double p);
signed main()
{
//    freopen("in.txt","r",stdin);
    
    cin>>n;
    int ta,tb;double tp;
    for(int i=1;i<n;i++)    
    {
        scanf("%d%d",&ta,&tb);cin>>tp;tp/=100.0;
        add_e(ta,tb,tp);
        add_e(tb,ta,tp);
    }
    for(int i=1;i<=n;i++)
        cin>>q[i],q[i]/=100;
    dfs1(1,0);
    f2[1]=f1[1];
    dfs2(1,0);
    double ans=0;
    for(int i=1;i<=n;i++)
        ans+=f2[i];
    printf("%0.6lf",ans);
}
inline void add_e(int u,int v,double p)
{
    ++num_e;
    u(num_e)=u;
    v(num_e)=v;
    p(num_e)=p;
    n(num_e)=f(u);
    f(u)=num_e;
}

 

转载于:https://www.cnblogs.com/Al-Ca/p/11188055.html

资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 无锡平芯微半导体科技有限公司生产的A1SHB三极管(全称PW2301A)是一款P沟道增强型MOSFET,具备低内阻、高重复雪崩耐受能力以及高效电源切换设计等优势。其技术规格如下:最大漏源电压(VDS)为-20V,最大连续漏极电流(ID)为-3A,可在此条件下稳定工作;栅源电压(VGS)最大值为±12V,能承受正反向电压;脉冲漏极电流(IDM)可达-10A,适合处理短暂高电流脉冲;最大功率耗散(PD)为1W,可防止器件过热。A1SHB采用3引脚SOT23-3封装,小型化设计利于空间受限的应用场景。热特性方面,结到环境的热阻(RθJA)为125℃/W,即每增加1W功率损耗,结温上升125℃,提示设计电路时需考虑散热。 A1SHB的电气性能出色,开关特性优异。开关测试电路及波形图(图1、图2)展示了不同条件下的开关性能,包括开关上升时间(tr)、下降时间(tf)、开启时间(ton)和关闭时间(toff),这些参数对评估MOSFET在高频开关应用中的效率至关重要。图4呈现了漏极电流(ID)与漏源电压(VDS)的关系,图5描绘了输出特性曲线,反映不同栅源电压下漏极电流的变化。图6至图10进一步揭示性能特征:转移特性(图7)显示栅极电压(Vgs)对漏极电流的影响;漏源开态电阻(RDS(ON))随Vgs变化的曲线(图8、图9)展现不同控制电压下的阻抗;图10可能涉及电容特性,对开关操作的响应速度和稳定性有重要影响。 A1SHB三极管(PW2301A)是高性能P沟道MOSFET,适用于低内阻、高效率电源切换及其他多种应用。用户在设计电路时,需充分考虑其电气参数、封装尺寸及热管理,以确保器件的可靠性和长期稳定性。无锡平芯微半导体科技有限公司提供的技术支持和代理商服务,可为用户在产品选型和应用过程中提供有
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值