• HAOI2015 按位或


    咕了很久的神仙题
    很早就被安利来做了
    但是一直没有勇气做,觉得太难了
    今天终于肝了这道题.
    其实——还是很难


    题目链接

    (LOJ)
    (Luogu)


    前置芝士:(Min-Max)容斥

    这是我做的第一道(Min-Max)容斥题
    好神仙的操作啊

    (Min-Max)容斥(或者称最值反演)具体而言是两个公式——
    (Min(S))表示集合(S)中的最小值.
    (Max(S))表示集合(S)中的最大值.

    [Max(S)=sum_{Tsubset S}(-1)^{|T|+1}Min(T)\ Min(S)=sum_{Tsubset S}(-1)^{|T|+1}Max(T) ]

    更神仙的是它支持期望,这在这道题中有很好的体现.


    解析

    我们用(Max(S))表示集合(S)中最后的(1)出现时间的期望,用(Min(S))表示集合(S)中最早的(1)出现时间的期望.
    那么,答案就是(Max(2^n-1))
    (Min-Max)容斥得(Max(S)=sum_{Tsubset S}(-1)^{|T|+1}Min(T))
    那么我们只要求出所有的(Min(S))即可
    如何快速求(Min(S))呢?
    只要我们有一次(rand)到了(T),(Tcap S ot=emptyset),那么(S)中就有(1)了.
    那么(Min(S)=frac{1}{sum_{Tcap S ot=emptyset}P_T})
    但是这个东西并不是那么好求,直接枚举子集的复杂度是(O(3^n))的,无法承受.
    我们考虑容斥?(可能并不算容斥吧)
    (S')(S)在全集中的补集(即(S'=Soplus (2^n-1))).
    如果(Tcap S=emptyset),那么(Tsubset S').
    因此(sum_{Tcap S ot=emptyset}P_T=1-sum_{T'subset S'}P_{T'})
    (sum_{T'subset S'}P_{T'})是可以用(FWT(FMT))求的.
    因此我们就做一次(FWT)即可.
    时间复杂度(O(2^n*n))

    代码如下
    真的短得一匹

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #define N (21)
    #define M (1<<N)
    #define inf (0x7f7f7f7f)
    #define rg register int
    #define Label puts("NAIVE")
    #define spa print(' ')
    #define ent print('
    ')
    #define rand() (((rand())<<(15))^(rand()))
    #define eps 1e-9
    typedef long double ld;
    typedef long long LL;
    typedef unsigned long long ull;
    using namespace std;
    int n,Lim,pc[M]; ld a[M],ans;
    int main(){
    	scanf("%d",&n),Lim=(1<<n);
    	for(int i=0;i<Lim;i++)scanf("%Lf",&a[i]);
    	for(int i=1;i<Lim;i<<=1)
    	for(int R=i<<1,j=0;j<Lim;j+=R)
    	for(int k=j;k<j+i;k++)a[i+k]+=a[k];
    	for(int i=0;i<Lim;i++)pc[i]=pc[i>>1]+(i&1);
    	for(int i=1;i<Lim;i++){
    		if(fabs(1.0-a[i^(Lim-1)])<eps){puts("INF"),exit(0);}
    		ld t=1.0/(1.0-a[i^(Lim-1)]);if(pc[i]&1)ans+=t;else ans-=t;
    	}
    	printf("%.10Lf",ans);
    }
    
  • 相关阅读:
    Nginx 代理gRPC—为 Skywalking 提供负载均衡
    分布式链路追踪 SkyWalking 源码分析 —— Agent 发送 Trace 数据
    skywalking中后端collect采样率的设置
    洛谷 P3387 【模板】缩点(Tarjan,DAG上的dp)
    洛谷 P1613 跑路(Floyd,倍增)&& 【模板】 Floyd
    HEOI 2014 南园满地堆轻絮
    洛谷 P7108 移花接木
    CF594A Warrior and Archer
    CF187B AlgoRace
    浅谈vector容器的奇技淫巧
  • 原文地址:https://www.cnblogs.com/Romeolong/p/10120731.html
Copyright © 2020-2023  润新知