fw刚学OI,看不懂样例求助555
查看原帖
fw刚学OI,看不懂样例求助555
891956
TempestMiku楼主2023/7/17 21:34

orz,

样例输入 #2

5
1 2 90
1 3 80
1 4 70
1 5 60
100 10 20 30 40

样例输出 #2

4.300000

我认为每个点的概率为它自己来电的概率加上其他点通过若干个导线到达这个点的概率

于是用O(???)O(???)写暴力对于每个点都作为根跑dfs

#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;
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],nowdian[N],zhongdian[N];
inline void dfs(int now,int fa,double val){
    nowdian[now]+=(val*nowdian[fa]);
    for(register int i=head[now];i;i=nxt[i]){
        int y=to[i];
        if(y==fa) continue;
        dfs(y,now,optbian[i]);
    }
}
signed main(){
    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;
    }
    for(register int i=1;i<=n;i++){
        if(optdian[i]){
            memset(nowdian,0,sizeof(nowdian));
            // for(register int i=1;i<=N;i++){
            //     if(optdian[i]){
            //         nowdian[i]=optdian[i];
            //     }
            //     else {
            //         nowdian[i]=0;
            //     }
            // }
            nowdian[i]=optdian[i];
            dfs(i,0,0);
            for(register int i=1;i<=n;i++){
                if(!nowdian[i]) continue;
                zhongdian[i]+=nowdian[i];
                zhongdian[i]=min(1.0,zhongdian[i]);
            }
        }
    }
    double Tempestissimo(0);
    for(register int i=1;i<=n;i++){
        // cerr<<zhongdian[i]<<" ";
        Tempestissimo+=zhongdian[i];
    }
    cerr<<endl;
    printf("%.6lf",Tempestissimo);
    
    return 0;
}

但是我模拟样例2也没模拟出来4.300000 😭

求解释样例

2023/7/17 21:34
加载中...