1 条题解

  • 0
    @ 2025-8-24 22:17:17

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 万弘
    新生。

    搬运于2025-08-24 22:17:17,当前版本为作者最后更新于2020-08-10 08:26:40,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    不至于没有题解吧。。。

    首先假设一个女性中意 kk 个男性,总得先把概率算出来吧。

    对于第一个男性,选中的概率 g(1)=P+(1P)kP+(1P)2kP+...g(1)=P+(1-P)^kP+(1-P)^{2k}P+...
    等比数列求和得 $g(1)=P\frac{1-(1-P)^\infty}{1-(1-P)^k}=\frac{P}{1-(1-P)^k}$

    i>1,g(i)=g(i1)×(1P)\forall i>1,g(i)=g(i-1)\times (1-P),故可以求出所有 g(i)g(i).
    从小到大考虑每个女性 ii,若选择第 jj 个中意的男性(记为 ai,ja_{i,j} ),则贡献为

    $$\sum_{aa_{i,j}}P(a\text{ 选 }b)\times g(j) $$

    这就是个单点加,询问后缀和。树状数组维护即可。

    复杂度 O(mlogn)\mathcal O(m\log n)

    PS:有点卡精度,我用 double 90pts,long double 就过了

    #define MAXN 500011
    int n;
    struct BIT
    {
        long double t[MAXN];
        #define lowb (i&-i)
        void modify(int i,long double k)
        {
            while(i<=n)t[i]+=k,i+=lowb;
        }
        long double Qsum(int i)
        {
            long double res=0;
            while(i)res+=t[i],i-=lowb;
            return res;
        }
    }t;
    std::vector<int>a[MAXN];
    long double Qpow(long double x,int p)
    {
        long double res=1;
        while(p)
        {
            if(p&1)res*=x;
            x*=x,p>>=1;
        }
        return res;
    }
    int main()
    {
        n=read();
        int m=read();
        double tmp;
        scanf("%lf",&tmp);
        long double p=tmp,ans=0;
        for(int i=1;i<=m;++i)
        {
            int u=read(),v=read();
            a[u].push_back(v);
        }
        for(int u=1;u<=n;++u)
        {
            if(a[u].empty())continue;
            std::sort(a[u].begin(),a[u].end());
            long double now=p/(1-Qpow(1-p,a[u].size()));
            for(int v:a[u])
            {
                ans+=t.Qsum(n-v)*now;
                now*=(1-p);
            }
            now=p/(1-Qpow(1-p,a[u].size()));
            for(int v:a[u])
            {
                t.modify(n-v+1,now);
                now*=(1-p);
            }
        }
        printf("%.2lf",tmp=ans);
        return 0;
    }
    
    • 1

    信息

    ID
    5118
    时间
    2000ms
    内存
    500MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者