社区讨论

100pts被Hack求调

P4284[SHOI2014] 概率充电器参与者 5已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@lo24uzn6
此快照首次捕获于
2023/10/23 08:01
2 年前
此快照最后确认于
2023/11/03 08:20
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
namespace Testify{
    inline int read(){
        int f(1),x(0);
        char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
        for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
        return f*x;
    }
    inline void Write(int x){
        if(x>9) Write(x/10);
        putchar(x%10+48);
    }
    inline void write(int x){
        if(x<0) putchar('-'),x=-x;
        Write(x);
        putchar('\n');
    }
}
using namespace Testify;
const double eps=1e-6;
inline bool compare(double a){
    if(fabs(a)<eps){
        return false;
    }
    return true;
}
int n;
const int N=5e5+555;
int head[N],nxt[N<<1],to[N<<1],tot(0);
double optbian[N<<1];
inline void add(int x,int y,double val){
    to[++tot]=y,nxt[tot]=head[x],head[x]=tot,optbian[tot]=val;
    return ;
}
double optdian[N],f[N];//i不通电且以i为根的子树不通电
double g[N];//i不通电且i外树不通电

//一个点子树不来这个点电的贡献可以拆成 
//子树没电
//子树带电,但是导线不通电
inline void dfs(int now,int fa){
    f[now]=1-optdian[now];//自己通电
    for(register int i=head[now];i;i=nxt[i]){
        int y=to[i];
        if(y==fa) continue;
        dfs(y,now);
        double v=optbian[i];//子树没电         子树带电但是导线不通电
        f[now]*=(f[y]+(1-f[y])*(1-v));
    }
}
//一个点外的树给它不充电的贡献可以拆成
//这个点的父亲节点外的不充电贡献
//以 这个点的父亲节点 为根的子树除去这个点为根的子树的贡献
//有点类似于 换根dp

//根据上文注释

//一个点子树不来这个点电的贡献可以拆成 
//子树没电
//子树带电,但是导线不通电


inline void dfs2(int now,int fa){
    for(register int i=head[now];i;i=nxt[i]){
        int y=to[i];
        if(y==fa) continue;
        double v=optbian[i];
        if(!compare(f[y]+(1-f[y]*(1-v)))) continue;
        double P=g[now]*((f[now])/(f[y]+(1-f[y])*(1-v)));
        //P的意思是求出y的子树外不带电的情况数
        g[y]=P+(1-P)*(1-v);
        //    子树外不带电 或者 子树外带电但是导线不通电
        dfs2(y,now);//自上而下更新所以dfs2放到下面
    }
}
signed main(){
    // cerr<<compare(1e-8);
    system("title IZANA");
    // system("title ?超絶最かわ?てんしちゃん");
    n=read();
    for(register int i=1;i<n;i++){
        register int asd=read(),jkl=read();
        double val;
        scanf("%lf",&val);
        add(asd,jkl,val/100),add(jkl,asd,val/100);
    }
    for(register int i=1;i<=n;i++){
        double tmp;
        scanf("%lf",&tmp);
        optdian[i]=tmp/100;
    }
    g[1]=1;
    dfs(1,0),dfs2(1,0);
    double Tempestissimo(0);
    for(register int i=1;i<=n;i++){
        // cerr<<f[i]*g[i]<<" ";
        Tempestissimo+=(1-f[i]*g[i]);//通电
    }
    cerr<<endl;
    printf("%.6lf",Tempestissimo);
    
    return 0;
}   

回复

9 条回复,欢迎继续交流。

正在加载回复...