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. bcompare Linux版 无限试用

    需要root权限.   # mv /usr/bin/bcompare /usr/bin/bcompare.real # cat /usr/bin/bcompare #!/bin/sh rm " ...

  2. Codeforces 913D - Too Easy Problems

    913D - Too Easy Problems 思路:二分check k 代码: #include<bits/stdc++.h> using namespace std; #define ...

  3. php入门之数据类型

    String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值),资源. 返回类型 getType ...

  4. (转)理解TIME_WAIT,彻底弄清解决TCP: time wait bucket table overflow

    转载自http://blog.51cto.com/benpaozhe/1767612: 一直对这个问题知其然而不知其所以然,这些日子再次碰到,看了很多的资料,彻底解决一下,呵呵,先上个图,所有理解围绕 ...

  5. Java基础-封装(09)

    通过对象直接访问成员变量,会存在数据安全问题(比如年龄不能为负).这个时候,我们就不能让外界的对象直接访问成员变量. private关键字 是一个权限修饰符.可以修饰成员(成员变量和成员方法)被pri ...

  6. 11g adg 环境搭建实施手册-0908

    11g adg 环境搭建实施手册-0908 2017年8月30日 9:16 11g adg 环境搭建实施手册-0824 2017年8月24日 10:18 ####################### ...

  7. java标号

    标号用于控制循环执行流程: public static void main(String[] args) { mark: for(int i = 0; i < 3; i++) { System. ...

  8. spring boot 学习(十四)SpringBoot+Redis+SpringSession缓存之实战

    SpringBoot + Redis +SpringSession 缓存之实战 前言 前几天,从师兄那儿了解到EhCache是进程内的缓存框架,虽然它已经提供了集群环境下的缓存同步策略,这种同步仍然需 ...

  9. C语言描述队列的实现及操作(数组实现)

    一.静态数组实现 1.队列接口 #include<stdio.h> // 一个队列模块接口 // 命名为myqueue.h #define QUEUE_TYPE int // 定义队列类型 ...

  10. HDU 2767 Proving Equivalences (Tarjan)

    Proving Equivalences Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other ...