1 条题解
-
0
自动搬运
来自洛谷,原作者为

万弘
新生。搬运于
2025-08-24 22:17:17,当前版本为作者最后更新于2020-08-10 08:26:40,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
不至于没有题解吧。。。
首先假设一个女性中意 个男性,总得先把概率算出来吧。
对于第一个男性,选中的概率
等比数列求和得 $g(1)=P\frac{1-(1-P)^\infty}{1-(1-P)^k}=\frac{P}{1-(1-P)^k}$且 ,故可以求出所有 .
$$\sum_{aa_{i,j}}P(a\text{ 选 }b)\times g(j) $$
从小到大考虑每个女性 ,若选择第 个中意的男性(记为 ),则贡献为这就是个单点加,询问后缀和。树状数组维护即可。
复杂度
PS:有点卡精度,我用
double90pts,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
- 上传者