题解:P6089 [JSOI2015] 非诚勿扰
分析
首先我们要求出对于第
第一轮选择第一位的概率为
显然第一轮选择第
假设列表中有
所以选择第一位的概率
上下两式相减,得到:
这样我们就搞定了
显然有:
我们已经对于每个女性求出选择每个男性的概率,现在要考虑如何求得答案。
令
答案就是下式:
考虑从小到大枚举女性,这样就保证了后枚举的女性编号一定大于枚举过的。
我们可以维护一个序列,存储选择第
每次枚举
在枚举完一个
单点修改,区间查询,用树状数组维护。
时间复杂度
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); }
本文作者:redacted-area
本文链接:https://www.cnblogs.com/redacted-area/p/18405328
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步