bzoj4036 [HAOI2015]按位或

题目描述

题解

考虑 $min-max$ 容斥

设 $E(max/min\{s\})$ 表示 $s$ 集合中最晚/最早出现的元素的时间的期望

则 $E(max\{s\})=\sum_{t⊆s}(-1)^{|T|-1}E(min\{t\})$

求 $E(min{t})$ 比较容易,就是 $\frac{1}{\sum_{x∩t \ne ϕ}p_x}$

考虑分母怎么求,那我们可以用 $1$ 减去和 $t$ 没有交集的集合的概率和,也就是 $t$ 的补集的子集,那就可以用 $fwt_{or}$ 来求

效率: $O(n2^n)$

代码

#include <bits/stdc++.h>
using namespace std;
int n,t,a[1<<20];
double p[1<<20],s;
int main(){
    cin>>n;t=(1<<n);
    for (int i=0;i<t;i++)
        scanf("%lf",&p[i]),
        a[i]=a[i>>1]+(i&1);
    for (int i=1;i<t;i<<=1)
        for (int j=0;j<t;j+=(i<<1))
            for (int k=0;k<i;k++)
                p[i+j+k]+=p[j+k];
    for (int i=1;i<t;i++)
        if (1-p[(t-1)^i]>1e-10)
            s+=((a[i]&1)?1.:-1.)/(1-p[(t-1)^i]);
    if (s<1e-10) puts("INF");
    else printf("%.10lf\n",s);
    return 0;
}

 

posted @ 2020-02-02 21:20  xjqxjq  阅读(103)  评论(0编辑  收藏  举报