数数题,对拍过了,交上去几乎全 WA
查看原帖
数数题,对拍过了,交上去几乎全 WA
372708
Yahbim楼主2022/6/22 12:15

人傻了,第一次看到数数题对拍过了交上去不过的

处理了除 0 的情况

#include<bits/stdc++.h>
#define file_in(x) (freopen(#x".in","r",stdin))
#define file_out(x) (freopen(#x".out","w",stdout))
using namespace std;
typedef double db;

template<class type> type read(type ret=0,int w=0,char ch=getchar()){
    while(!isdigit(ch)) w=ch=='-',ch=getchar();
    while(isdigit(ch)) ret=ret*10+ch-'0',ch=getchar();
    return w?-ret:ret;
}

const int N=5e5+5;
const db eps=1e-9;
int n,head[N],cntedg=1,c[N];
db p[N],f[N],g[N],h[N],ans;
struct edge{int to,nxt;db w;}edg[N<<1];

void add(int u,int v,db w){edg[++cntedg]={v,head[u],w},head[u]=cntedg;}

void dfs1(int u,int fa=0){
    f[u]=h[u]=1-p[u];
    for(int i=head[u];i;i=edg[i].nxt){
        int v=edg[i].to;db w=edg[i].w;
        if(v==fa) continue;
        dfs1(v,u);
        f[u]*=1+f[v]*w-w;
        f[v]<=eps&&1-w<=eps?++c[u]:h[u]*=1+f[v]*w-w;
    }
}

void dfs2(int u,int fa=0){
    if(!fa) g[u]=1;
    for(int i=head[u];i;i=edg[i].nxt){
        int v=edg[i].to;db w=edg[i].w,tmp;
        if(v==fa) continue;
        tmp=g[u]*(f[v]<=eps&&1-w<=eps?c[u]==1?h[u]:0:f[u]/(1+f[v]*w-w));
        g[v]=1+tmp*w-w;
        dfs2(v,u);
    }
}

signed main(){
    file_in(data),file_out(P4284);
    n=read<int>();
    for(int i=1;i<n;++i){
        int u=read<int>(),v=read<int>(),w=read<int>();
        add(u,v,w*0.01);
    }
    for(int i=1;i<=n;++i) p[i]=read<int>()*0.01;
    dfs1(1),dfs2(1);
    for(int i=1;i<=n;++i) ans+=1-f[i]*g[i];
    printf("%.6lf\n",ans);
    return 0;
}

//~kawaii~
2022/6/22 12:15
加载中...