首页 > 其他分享 >题解:P6089 [JSOI2015] 非诚勿扰

题解:P6089 [JSOI2015] 非诚勿扰

时间:2024-09-09 21:02:42浏览次数:11  
标签:非诚 概率 JSOI2015 cdot 题解 sum 选择 int 枚举

分析

首先我们要求出对于第 \(i\) 位女性,她选择每个列表中的男性的概率是多少。

第一轮选择第一位的概率为 \(p\),选择第二位的概率为 \(p(1-p)\),以此类推。

显然第一轮选择第 \(k\) 位的概率为 \(p(1-p)^{k-1}\)。

假设列表中有 \(n\) 名男性,那么第二轮选择第一位的概率为 \(p(1-p)^n\)。

所以选择第一位的概率 \(P_1\) 为:

\[\begin{aligned} P_1&=\sum^{\infty}_{i=0}p(1-p)^{n\cdot i}\\ (1-p)P_1&=\sum^{\infty}_{i=1}p(1-p)^{n\cdot i}\\ \end{aligned} \]

上下两式相减,得到:

\[\begin{aligned} (1-(1-p)^n)P_1&=\sum^{\infty}_{i=0}p(1-p)^{n\cdot i}-\sum^{\infty}_{i=1}p(1-p)^{n\cdot i}\\ (1-(1-p)^n)P_1&=p\\ P_1&=\frac{p}{1-(1-p)^n}\\ \end{aligned} \]

这样我们就搞定了 \(P_1\)。

显然有:\(P_i=(1-p)P_{i-1}\)。

我们已经对于每个女性求出选择每个男性的概率,现在要考虑如何求得答案。

令 \(S_i\) 为第 \(i\) 个女性可选择的男性的集合。

答案就是下式:

\[\sum_{i=1}^n\sum_{b\in S_i}\sum_{j=1}^{i-1}\sum_{k=b+1}^n P(j\ 选\ k)\cdot P(i\ 选\ b) \]

考虑从小到大枚举女性,这样就保证了后枚举的女性编号一定大于枚举过的。

我们可以维护一个序列,存储选择第 \(b\) 个男性的期望人数。

每次枚举 \(i\) 和 \(b\),对答案的贡献就是 \([b+1, n]\) 这个区间内的期望人数。

在枚举完一个 \(i\) 后,将自己选择每个男性的概率累加到序列上。

单点修改,区间查询,用树状数组维护。

时间复杂度 \(O(m\log m)\)。

Code

#include<bits/stdc++.h>
using namespace std;
#define maxn 500005
typedef long double f64_t;

struct BIT:vector<f64_t>
{
    using vector::vector;
    void modify(int p, f64_t x)    {for(;p<size();p+=p&-p) at(p)+=x;}
    f64_t query(int p) {f64_t r=0;for(;p;p-=p&-p) r+=at(p);return r;}
};

BIT ta(maxn);
vector<int> al[maxn];

int main()
{
    int n, m;
    f64_t p, ans=0;
    cin>>n>>m>>p;
    for(int a, b;m--;)
        cin>>a>>b, al[a].emplace_back(b);
    for(int i=1;i<=n;i++)
    {
        if(al[i].empty()) continue;
        sort(al[i].begin(), al[i].end());
        for(f64_t px=p/(1-pow(1-p, al[i].size()));auto b:al[i])
            ans+=(ta.query(n)-ta.query(b))*px, 
            ta.modify(b, px), px*=1-p;
    }
    cout<<format("{:.2f}", ans);
}

标签:非诚,概率,JSOI2015,cdot,题解,sum,选择,int,枚举
From: https://www.cnblogs.com/redacted-area/p/18405328

相关文章

  • 题解:P3968 [TJOI2014] 电源插排
    题意维护一个\(01\)串,初始均为\(0\),支持:单点将\(1\)修改为\(0\)。查询区间中\(1\)的个数。查询最长且最靠右的连续\(0\)段的靠右的中点,并将其改为\(1\)。分析第一个操作和第二个操作显然使用动态开点线段树维护。我们只需要解决第三个操作。我们用平衡树存储......
  • CF1621G Weighted Increasing Subsequences 题解
    题目链接点击打开链接题目解法这种题就感觉每一步都不难想,但串在一起就不会显然考虑位置\(x\)作为\(lis\)的一部分,合法的\(lis\)的个数合法的约束是:令\(lis\)的最后一个位置为\(last\),满足\(\max\{a_{last+1},...,a_n\}>a_x\)不难发现,合法的\(last\)是一段区间......
  • 【最新华为OD机试E卷-支持在线评测】通过软盘拷贝文件(200分)多语言题解-(Python/C/Ja
    ......
  • P7230 题解
    P7230思路对每个左端点维护右端点\(res_i\)。操作形如删去一个数再加入一个数。如果删掉\(p\)上的\(a_p\),找到左右最近的\(l,r\)使得\(a_l=a_r=a_p\)。那么\(res_{l+1},\dotsb,res_p\)对\(r\)取max。实际上要维护\(\maxres_i-i+1\),因为\(res_i\)单调,所以相当于......
  • 【题解】Solution Set - NOIP2024集训Day25 概率期望 dp
    【题解】SolutionSet-NOIP2024集训Day25概率期望dphttps://www.becoder.com.cn/contest/5515「QOJ2606」Gachapon\(f_{i,j}\):用一次合法的level-irolling能够抽到的\(j\)的期望个数。\(h_{i,j,k}\):在\(i\)次操作之内,抽到恰好\(k\)个\(j\)的概率。\[h_{i,j,k......
  • luogu4198题解
    随机说话这个题做法没见过记一下。我一开始以为是李超树的题,结果把李超树打上之后就不会做了。然后题读错了写了一个弱化版。题目分析做法参考这个题题意只是假装是一个有关线段的题。简化之后的题意如下。有一个初始都为\(0\)的实数数列,每一次会修改位置\(x\)的数为......
  • Flutter 3.24 构建 release 抛出部分依赖 AAPT: error: resource android:attr/lStar
    问题截图:一些讨论:https://github.com/transistorsoft/flutter_background_fetch/issues/369问题原因及解决方案:@Aziz-T该问题与插件的compileSdkVersion和targetSdkVersion有关。出现该问题的原因是部分插件的compileSdkVersion和targetSdkVersion版本过旧。请前往......
  • P2471 [SCOI2007] 降雨量 题解
    题目传送门分析分讨题。首先发现是RMQ问题(区间最值),可以用线段树或ST表来维护(代码为线段树,因为我忘记ST表怎么写了)。然后发现有些年份不明确导致区间判断似乎不好搞。但事实上只要判断下标差是否等于年份差即可得出该区间有无不明确年份。其次考虑“必真”,“必假”,“......
  • 【洛谷 P1996】约瑟夫问题 题解(数组+模拟+循环)
    约瑟夫问题题目描述个人围成一圈,从第一个人开始报数,数到的人出列,再由下一个人重新从开始报数,数到的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰名小朋友,而该题是全部出圈。输入......
  • 题解 GZOI2023D2B【乒乓球】
    4s,512M题目描述Alice和Bob在打乒乓球,乒乓球比赛的规则是这样的:一场比赛中两位选手将进行若干局比赛,选手只需要赢得\(X\)局比赛就宣告其胜利;每局比赛中两位选手将进行若干盘比赛,选手只需要赢得\(Y\)盘比赛就宣告其胜利;每盘比赛中两位选手将进行乒乓球对决,有且仅有一位选......