hdu5036(bitset求并集)

来源:互联网 发布:文字设计软件手机软件 编辑:程序博客网 时间:2024/05/16 04:57

//bitset 求并集加速。

i - > j , j - > k 处理出 i > k 

可以直接这样,前提数组的值为0 或 1

        //注意循环顺序。        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                if(vis[j][i]){                    vis[j] |= vis[i];                }            }        }



本题处理出可以通向某个门的方案数,

到达某个门的期望就是 1/方案数

最后求和就是打开或炸开所有门的期望。

#include <set>#include <map>#include <list>#include <cmath>#include <ctime>#include <deque>#include <queue>#include <stack>#include <cctype>#include <cstdio>#include <string>#include <vector>#include <cassert>#include <cstdlib>#include <cstring>#include <sstream>#include <iostream>#include <algorithm>#include <bitset>#define PI acos(-1.0)#define MOD 1000000009#define INF 0x3f3f3f3f#define Lowbit(x) (x & (-x))#define mem(a,x) memset(a,x,sizeof(a))#define Read()  freopen("in.txt", "r", stdin);#define Write() freopen("out.txt", "w", stdout);#define bitnum(a) __builtin_popcount(a)using namespace std;typedef long long int ll;inline int in(){    ll res=0;char c;ll f=1;    while((c=getchar())<'0' || c>'9')if(c=='-')f=-1;    while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();    return res*f;}const int N =1010;bitset<N>vis[N];int main(){    int t;scanf("%d",&t);    for(int cas=1;cas<=t;cas++){        printf("Case #%d: ",cas);        int n;scanf("%d",&n);        for(int i=1;i<=n;i++){            vis[i].reset();            vis[i][i] = 1;            int k;scanf("%d",&k);            for(int j=0;j<k;j++){                int tmp;scanf("%d",&tmp);                vis[i][tmp] = 1;            }        }        //注意循环顺序。        for(int i=1;i<=n;i++){            for(int j=1;j<=n;j++){                if(vis[j][i]){                    vis[j] |= vis[i];                }            }        }        double ans = 0;        for(int i=1;i<=n;i++){            double num = 0.0;            for(int j=1;j<=n;j++){                if(vis[j][i])                    num += 1;            }            ans += 1/num;            //假如我们有k个门都能到达第u个门,然而每次都是只能选择一个门来到u,那么显然,到达u的期望是1/k            //期望的独立可加性;            // 有num种方法到达i;        }        printf("%.5f\n",ans);    }    return 0;}


1 0
原创粉丝点击