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. typeof

    1.用法 typeof num typeof(num) 2.返回值    "number"."string"."boolean"." ...

  2. 证明: 2^0+2^1+2^2+2^3+.+2^n-1=(2^n)-1

    S=2^0+2^1+2^2+2^3+.+2^(n-1)2S=2^1+2^2+2^3+...+2^(n-1)+2^n两式相减,2S-S=2^n-2^0S=2^(n)-1

  3. chrome表单自动填充去掉input黄色背景

    input文本框是纯色背景的 1. input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset!important; ...

  4. windows7 桌面突然卡住了,点击右键点不了,点击桌面软件点不了,怎么办?

    关闭并重启explorer.exe进程命令操作 :1. cmd 2. taskkill /f /im explorer.exe && start explorer.exe

  5. [.NET开发] C#使用doggleReport生成pdf报表的方法

    本文实例讲述了C#使用doggleReport生成pdf报表的方法.分享给大家供大家参考,具体如下: 1. 安装nuget -install package DoddleReport -install ...

  6. Linux Used内存到底哪里去了?

    原创文章,转载请注明: 转载自系统技术非业余研究 本文链接地址: Linux Used内存到底哪里去了? 前几天 纯上 同学问了一个问题: 我ps aux看到的RSS内存只有不到30M,但是free看 ...

  7. ViewPagerIndicator+viewpager的简单使用,不需要导入Library包

    ViewPagerIndicator作为一款分页指标小部件兼容ViewPager,封装上做得非常不错,目前已为众多知名应用所使用. ViewPagerIndicator+viewpager实现如下效果 ...

  8. java.lang.UnsupportedClassVersionError: com/my/test/TestUser : Unsupported major.minor version 52.0

    问题原因: 1.执行代码的jdk版本 低于 编译的jdk版本 2.项目用JDK1.8运行过,现在又在本地的eclipse等开发工具或者本地环境变量为低版本的jdk1.7或者jdk1.6下运行,ecli ...

  9. A Creative Cutout CodeForces - 933D (计数)

    大意:给定$n$个圆, 圆心均在原点, 第$k$个圆半径为$\sqrt{k}$ 定义一个点的美丽值为所有包含这个点的圆的编号和 定义函数$f(n)$为只有$n$个圆时所有点的贡献,求$\sum_{k= ...

  10. Oracle11g温习-第十章:存储架构

    2013年4月27日 星期六 10:38 1.oracle 存储架构: 1)  database  ------------tablespace-------------segment(对象) --- ...