Description

【故事背景】

JYY赶上了互联网创业的大潮,为非常勿扰开发了最新的手机App实现单身

大龄青年之间的“速配”。然而随着用户数量的增长,JYY发现现有速配的算法似

乎很难满足大家的要求,因此JYY决定请你来调查一下其中的原因。

【问题描述】

应用的后台一共有N个女性和M个男性,他们每个人都希望能够找到自己的

合适伴侣。为了方便,每个男性都被编上了1到N之间的一个号码,并且任意两

个人的号码不一样。每个女性也被如此编号。

JYY应用的最大特点是赋予女性较高的选择权,让每个女性指定自己的“如

意郎君列表”。每个女性的如意郎君列表都是所有男性的一个子集,并且可能为

空。如果列表非空,她们会在其中选择一个男性作为自己最终接受的对象。

JYY用如下算法来为每个女性速配最终接受的男性:将“如意郎君列表”中的

男性按照编号从小到大的顺序呈现给她。对于每次呈现,她将独立地以P的概率

接受这个男性(换言之,会以1−P的概率拒绝这个男性)。如果她选择了拒绝,

App就会呈现列表中下一个男性,以此类推。如果列表中所有的男性都已经呈现,

那么中介所会重新按照列表的顺序来呈现这些男性,直到她接受了某个男性为止。

显然,在这种规则下,每个女性只能选择接受一个男性,而一个男性可能被多个

女性所接受。当然,也可能有部分男性不被任何一个女性接受。

这样,每个女性就有了自己接受的男性(“如意郎君列表”为空的除外)。现

在考虑任意两个不同的、如意郎君列表非空的女性a和b,如果a的编号比b的编

号小,而a选择的男性的编号比b选择的编号大,那么女性a和女性b就叫做一对

不稳定因素。

由于每个女性选择的男性是有一定的随机性的,所以不稳定因素的数目也是

有一定随机性的。JYY希望你能够求得不稳定因素的期望个数(即平均数目),

从而进一步研究为什么速配算法不能满足大家的需求。

Input

输入第一行包含2个自然数N,M,表示有N个女性和N个男性,以及所有女

性的“如意郎君列表”长度之和是M。

接下来一行一个实数P,为女性接受男性的概率。

接下来M行,每行包含两个整数a,b,表示男性b在女性a的“如意郎君列表”

中。

输入保证每个女性的“如意郎君列表”中的男性出现切仅出现一次。

1≤N,M≤500,000,0.4≤P<0.6

Output

输出1行,包含一个实数,四舍五入后保留到小数点后2位,表示不稳定因素的期望数目。

Sample Input

5 5

0.5

5 1

3 2

2 2

2 1

3 1

Sample Output

0.89


思路

直接考虑每个男人的期望贡献就可以了

用树状数组来维护

直接把每个男人的被选概率算出来统计答案

这东西推一下等比数列求和就可以了

水题

不过要卡精度,勇士请使用long double


#include<bits/stdc++.h>

using namespace std;

typedef long double lb;
const int N = 1e6 + 10; int n, m;
lb bit[N], p;
vector<int> g[N]; lb fast_pow(lb a, int b) {
lb res = 1.0;
while (b) {
if (b & 1) res *= a;
b >>= 1;
a *= a;
}
return res;
} void add(int x, lb val) {
while (x < N) {
bit[x] += val;
x += x & (-x);
}
} lb query(int x) {
lb res = 0;
while (x) {
res += bit[x];
x -= x & (-x);
}
return res;
} lb query(int l, int r) {
return query(r) - query(l - 1);
} int main() {
scanf("%d %d", &n, &m);
scanf("%Lf", &p);
for (int i = 1; i <= m; i++) {
int u, v; scanf("%d %d", &u, &v);
g[u].push_back(v);
}
for (int i = 1; i <= n; i++) {
sort(g[i].begin(), g[i].end());
}
lb ans = 0.0;
for (int i = 1; i <= n; i++) {
int len = g[i].size();
for (int j = 0; j < len; j++) {
lb cur = p * fast_pow(1.0 - p, j) / (1.0 - fast_pow(1.0 - p, len));
ans += query(g[i][j] + 1, m) * cur;
add(g[i][j], cur);
}
}
printf("%.2Lf", ans);
return 0;
}

BZOJ4481: [Jsoi2015]非诚勿扰【概率期望+树状数组】的更多相关文章

  1. bzoj 4481: [Jsoi2015]非诚勿扰【期望+树状数组】

    首先很容易计算对于一个如意郎君列表里有x个男性的女性,编号排第i位的男性被选的概率是 \[ p*(1-p)^{i-1}+p*(1-p)^{i-1+n}+p*(1-p)^{i-1+n}+- \] \[ ...

  2. BZOJ4481 JSOI2015非诚勿扰(概率期望+树状数组)

    首先求出每个女性接受某个男性的概率.这个概率显然是一个无穷等比数列求和. 然后按编号从小到大考虑每个女性,维护出每个男性被选择的期望次数,BIT上查询后缀和即可. 需要long double. #in ...

  3. 2018牛客网暑期ACM多校训练营(第五场) F - take - [数学期望][树状数组]

    题目链接:https://www.nowcoder.com/acm/contest/143/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...

  4. 牛客网暑期ACM多校训练营(第五场) F - take —— 期望+树状数组+逆元

    看到一篇好的博客特意转出来观摩大佬:转:https://blog.csdn.net/greybtfly/article/details/81413526 题目大意:给n个箱子排成一排,从头到尾按顺序依 ...

  5. CodeForces 602E【概率DP】【树状数组优化】

    题意:有n个人进行m次比赛,每次比赛有一个排名,最后的排名是把所有排名都加起来然后找到比自己的分数绝对小的人数加一就是最终排名. 给了其中一个人的所有比赛的名次.求这个人最终排名的期望. 思路: 渣渣 ...

  6. 2018牛客网暑假ACM多校训练赛(第五场)F take 树状数组,期望

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round5-F.html 题目传送门 - https://www.no ...

  7. BZOJ4785 ZJOI2017树状数组(概率+二维线段树)

    可以发现这个写挂的树状数组求的是后缀和.find(r)-find(l-1)在模2意义下实际上查询的是l-1~r-1的和,而本来要查询的是l~r的和.也就是说,若结果正确,则a[l-1]=a[r](mo ...

  8. BZOJ5058 期望逆序对 【矩乘 + 组合数学 + 树状数组】

    题目链接 BZOJ5058 题解 可以发现任意两个位置\(A,B\)最终位置关系的概率是相等的 如果数列是这样: CCCCACCCCBCCCC 那么最终有\(7\)种位置关系 \((A,B)\) \( ...

  9. [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)

    4785: [Zjoi2017]树状数组 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 297  Solved: 195[Submit][Status ...

随机推荐

  1. 批量删除Redis数据库中的Key

    批量删除KeyRedis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作 redis-cli keys &q ...

  2. angular5 directive和component的区别

    指令分为三类,组件,属性指令和结构性指令 组件(Component directive):UI组件,继承于Directive: 属性指令(Attribute directive):改变组件的样式: 结 ...

  3. grub 启动错误 "file not found"

    刚安装ubuntu 14.4 竟然出现这么尴尬的事,ubuntu 行不行? 幸好还是能从u盘启动后,转到硬盘. 然后在网上找到了解决方法. http://askubuntu.com/questions ...

  4. vsftpd配置手册(实用)

    作者: 木頭    来源: PHPChina 开源社区门户1.vsftpd配置参数详细整理 #接受匿名用户 anonymous_enable=YES #匿名用户login时不询问口令 no_anon_ ...

  5. LeetCode--038--报数(*)

    问题描述: 报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 111221 1 被读作  "one ...

  6. 20170724wdVBA正则表达式提取答案到Excel

    Public Sub RegExtractData() Dim StartTime, UsedTime StartTime = VBA.Timer Dim FilePath$ Dim FileName ...

  7. 搭建Eclipse+ADT+Android SDK 安卓开发环境

    安装JDK 请看JDK环境搭建 即可. 安装Eclipse Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运 ...

  8. boruvka算法

    算法正确性证明: 1.最优性:最小边一定包含在生成树中. 2.合法性:一定不会构成环.如果存在环说明一个点的最小连边有两个,显然矛盾. 算法时间复杂度证明: 每执行一次算法,所有联通块的大小都至少为2 ...

  9. git 下载代码

    git clone https://github.com/ContextLogic/Wish-Merchant-API.git wish(wish是下载的地址,这样的话,就在你的住文件夹上)

  10. OC 属性关键字

    // 属性关键字 /* 1.ARC下(自动管理内存,自动引用计数)(IOS) strong,weak ----------------------------------------- 2.MRC下( ...