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. nginx反向代理和正向代理,优缺点

    http://blog.csdn.net/lishaojun0115/article/details/53200629 nginx反向代理代理的是服务器,正向代理代理的是客户端, 反向代理是客户点发送 ...

  2. telnet 命令使用方法详解,telnet命令怎么用?

    什么是Telnet? 对于Telnet的认识,不同的人持有不同的观点,可以把Telnet当成一种通信协议,但是对于入侵者而言,Telnet只是一种远程登录的工具.一旦入侵者与远程主机建立了Telnet ...

  3. Intellij IDEA 搭建Spring Boot项目(一)

    原文出处 第一步选择File –> New –> Project –>Spring Initialer –> 点击Next 第二步自己修改 Group 和 Artifact 字 ...

  4. mycat分布式mysql中间件(自增主键)

    一.全局序列号 全局序列号是MyCAT提供的一个新功能,为了实现分库分表情况下,表的主键是全局唯一,而默认的MySQL的自增长主键无法满足这个要求.全局序列号的语法符合标准SQL规范,其格式为:nex ...

  5. codeforces 576a//Vasya and Petya's Game// Codeforces Round #319 (Div. 1)

    题意:猜数游戏变种.先选好猜的数,对方会告诉你他想的那个数(1-n)能不能整除你猜的数,问最少猜几个数能保证知道对方想的数是多少? 对一个质数p,如果p^x不猜,那么就无法区分p^(x-1)和p^x, ...

  6. json.dumps loads 终于区分出来了

    import json dict= {1:2, 3:4, "} print type(dict), dict # test json.dumps json_str = json.dumps( ...

  7. python-day34--并发编程之多线程

    理论部分 一.什么是线程: 1.线程:一条流水线的工作过程  2.一个进程里至少有一个线程,这个线程叫主线程 进程里真正干活的就是线程 3.进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资 ...

  8. HDU 4764 Stone (巴什博弈)

    题意 Tang和Jiang玩石子游戏,给定n个石子,每次取[1,k]个石子,最先取完的人失败,Tang先取,问谁是赢家. 思路 比赛的时候想了不久,还WA了一次= =--后来看题解才发现是经典的巴什博 ...

  9. zk如何实现watch

    在客户端发送命令:stat /zhang watch 在zk server中产生如下图的调用栈: //在DataTree类中有 private final WatchManager dataWatch ...

  10. UVALive 4174

    DES:给出一个字符串.连续空格的个数代表一个新的字符.奇数个表示0.偶数个表示1.然后根据这个码作为ASCII码.写出对应的字符.就是统计空格个数.二进制转换成十进制的小模拟.但是比赛的时候敲得很不 ...