HDU5036 Explosion(期望 bitset)

题意

题目链接

Sol

和cf上的一道题几乎一摸一样

首先根据期望的线性性,可以转化为求每个点的期望打开次数,又因为每个点最多会被打开一次,只要算每个点被打开的概率就行了

设\(anc[i]\)表示\(i\)的反图中能到达的点集大小,答案等于\(\sum_{i = 1}^n \frac{1}{anc[i]}\)(也就是要保证是第一个被选的)

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1001;
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int N;
bitset<MAXN> f[MAXN], Empty;
double solve() {
    N = read();
    for(int i = 1; i <= N; i++) f[i] = Empty;
    for(int i = 1; i <= N; i++) {
        int k = read();  f[i].set(i);
        for(int j = 1; j <= k; j++) {
            int v = read(); f[v].set(i);
        }
    }
    for(int k = 1; k <= N; k++)
        for(int i = 1; i <= N; i++)
            if(f[i][k]) f[i] = f[i] | f[k];
    double ans = 0;
    for(int i = 1; i <= N; i++) ans += 1.0 / f[i].count();
    return ans;
}
int main() {
    int T = read();
    for(int i = 1; i <= T; i++) printf("Case #%d: %.5lf\n", i, solve());
    return 0;
}

原文地址:https://www.cnblogs.com/zwfymqz/p/10275673.html

时间: 2024-10-11 02:30:16

HDU5036 Explosion(期望 bitset)的相关文章

HDU5036 Explosion(期望&amp;&amp;bitset)

#include <iostream> #include <cstring> #include <string> #include <vector> #include <cstdio> #include <algorithm> #include <cmath> #include <bitset> using namespace std; #define maxn 1005 bitset<1100>

hdu 5036 Explosion(概率期望+bitset)

Problem Description Everyone knows Matt enjoys playing games very much. Now, he is playing such a game. There are N rooms, each with one door. There are some keys(could be none) in each room corresponding to some doors among these N doors. Every key

hdu 5036 Explosion (bitset优化的传递闭包求解概率)

Explosion Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 142    Accepted Submission(s): 25 Problem Description Everyone knows Matt enjoys playing games very much. Now, he is playing such a g

hdu5036 Explosion 传递闭包

大哲哥的讲课内容 根据期望的线性性,得到总期望为各个点被轰的概率(不会证,好像是这样吧) 传递闭包解决出每个点的祖先(能到达它的点)就能算概率了 bitset能贡献1/w的复杂度,而且导致Floyd只剩下两个for了(一点都不像经典Floyd) 1 #include <bits/stdc++.h> 2 using namespace std; 3 int T,n,m,t; 4 bitset<1001> a[1001]; 5 int main() 6 { 7 scanf("

HDU 5036 Explosion (传递闭包+bitset优化)

<题目链接> 题目大意: 一个人要打开或者用炸弹砸开所有的门,每个门后面有一些钥匙,一个钥匙对应一个门,告诉每个门里面有哪些门的钥匙.如果要打开所有的门,问需要用的炸弹数量为多少. 解题分析:因为许多门和他们之后的钥匙可能形成闭包的关系,所以,对于所有的闭包而言,只需要炸毁其中的一个门,就可以用其后面的钥匙打开闭包中至少一扇另外的门,一次类推.所以,假设闭包中包含$num$扇门,用炸弹打开闭包中任意一扇门的概率就为:$1/num$(因为炸毁每个闭包的概率为1,即每个闭包必然需要一枚炸弹).所有

2014北京网络预选赛1005(强连通缩点+期望)HDU5036

Explosion Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 243    Accepted Submission(s): 63 Problem Description Everyone knows Matt enjoys playing games very much. Now, he is playing such a g

hdu 5036 Explosion bitset优化floyd

http://acm.hdu.edu.cn/showproblem.php?pid=5036 题意就是给定一副有向图,现在需要走遍这n个顶点,一开始出发的顶点是这n个之中的随便一个. 如果走了1,那么1能联通的顶点就可以直接走过去,其他不和1连通的,就需要炸坏.问需要炸弹的期望. 比如一副图是1-->2-->3的.那么期望是11 / 6 假如从1号点开始,1/3概率选中1号点开始,那么需要炸弹数是1(炸开一号),贡献是1/3 假如从2号点开始,1/3概率选中2号点开始,那么需要炸开2号点,然后

【bitset模板题】HDU 5036 Explosion

题意: 一个人要打开或者用炸弹砸开所有的门,每个门里面有一些钥匙,一个钥匙对应一个门,有了一个门的钥匙就能打开相应的门,告诉每个门里面有哪些门的钥匙,问用的炸弹为期望值. 分析: 期望值 = 每个门用炸弹炸开的概率之和 而 每个门用炸弹炸开的概率 = 1 / 到达这个门的方案数, 因为炸开门的方案只有一种 我们用bitset记录门间的联通情况,求出方案数即可 我们开一个bitset数组 a 假如  a[i] = 0  1  0  1  1  0  1          即 i 号门能到 1 3

HDU 5036 Explosion(北京网络赛E题)

HDU 5036 Explosion 题目链接 思路:对于每个点,只要考虑哪些炸掉能到他的个数cnt,那么他对应的期望就是1 / cnt,然后所以期望的和就是答案,用bitset来维护 代码: #include <cstdio> #include <cstring> #include <bitset> using namespace std; const int N = 1005; int t, n; bitset<N> bs[N]; int main()