Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 147  Solved: 75

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

HINT

Source

数学问题 期望 脑洞题

期望还能这么玩儿,真的神奇。

女方如果选中某个人,可能是第一轮选中的,也可能是第一轮没选人,在第二轮选中的,也可能在第三轮,第四轮……

看上去是个无限项的等比数列求和。

利用等比数列公式计算女方选某个人的概率:

  $ \frac{a_1*(1-p^n)}{1-p}$

在n无穷大的时候$ p^n $趋近于0,可以直接忽视掉。

这样就可以算出这个位置被选的概率。

这样,之后开始选择的女方如果选了某个更靠前位置,就多了这么些概率贡献一个逆序对。

将边按双关键字排序,用树状数组维护一个类似逆序对的东西即可。

数据卡精度,需要long double

 /*by SilverN*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct edge{
int x,y;
bool operator < (const edge &b)const{
return ((x==b.x && y<b.y) || x<b.x);
}
}a[mxn],c[mxn];
//
int n,m;
int len[mxn];
long double P,pr[mxn];
long double t[mxn];
void add(int x,double v){while(x<=n){t[x]+=v;x+=x&-x;}}
long double ask(int x){double res=0.0;while(x){res+=t[x];x-=x&-x;}return res;};
inline long double GetP(int x,int y){return P*pr[y-]/(-pr[len[x]]);}
int main(){
// freopen("in.txt","r",stdin);
n=read();m=read();scanf("%Lf",&P);
pr[]=1.0;
for(int i=;i<=m;i++){pr[i]=pr[i-]*(-P);}
for(int i=;i<=m;i++){
a[i].x=read();a[i].y=read();len[a[i].x]++;
}
sort(a+,a+m+);
long double ans=0.0;
int hd=;
for(int i=;i<=n;i++){//枚举左边
if(a[hd].x!=i)continue;
int cnt=;
while(a[hd].x==i){
++cnt;
add(a[hd].y,GetP(i,cnt));
ans+=GetP(i,cnt)*(ask(n)-ask(a[hd].y));
hd++;
}
}
printf("%.2f\n",(double)ans);
return ;
}

Bzoj4481 [Jsoi2015]非诚勿扰的更多相关文章

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

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

  2. BZOJ4481: [Jsoi2015]非诚勿扰【概率期望+树状数组】

    Description [故事背景] JYY赶上了互联网创业的大潮,为非常勿扰开发了最新的手机App实现单身 大龄青年之间的"速配".然而随着用户数量的增长,JYY发现现有速配的算 ...

  3. 【BZOJ4481&JSOI2015】非诚勿扰(数学期望)

    听说JSOI有版权问题就不放图了 如果前面的文章里的图需要删掉请通知我 题意:有一些女的要挑一些男的,挑中的几率均为p.一个男的可以无限次被挑中.若女a选中男b,女c选中男d,a<c,b> ...

  4. [JSOI2015]非诚勿扰

    Description [故事背景] JYY赶上了互联网创业的大潮,为非常勿扰开发了最新的手机App实现单身 大龄青年之间的“速配”.然而随着用户数量的增长,JYY发现现有速配的算法似 乎很难满足大家 ...

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

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

  6. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. 「JSOI2015」非诚勿扰

    「JSOI2015」非诚勿扰 传送门 我们首先考虑一名女性选中她列表里第 \(x\) 名男性的概率(假设她列表里共有 \(s\) 名男性): \[ P = p \times (1 - p) ^ {x ...

  9. bzoj4481非诚勿扰(期望dp)

    有n个女性和n个男性.每个女性的如意郎君列表都是所有男性的一个子集,并且可能为空.如果列表非空,她们会在其中选择一个男性作为自己最终接受的对象.将“如意郎君列表”中的男性按照编号从小到大的顺序呈现给她 ...

随机推荐

  1. spring 国际化i18n配置

    i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件等)无需做大的改 ...

  2. Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19698511 . 最近遇到了一系列的屏幕适配问题, 以及 ...

  3. oracle数据库之PL/SQL 流程控制语句

    介绍 PL/SQL 的流程控制语句, 包括如下三类: 1.控制语句: IF 语句 2.循环语句: LOOP 语句, EXIT 语句 3.顺序语句: GOTO 语句, NULL 语句 一 条件语句 IF ...

  4. CEntOS6.5从启动界面直接进入命令行界面

    ctrl + alt + F1 ctrl + alt + F2 ctrl + alt + F3 ctrl + alt + F4 ctrl + alt + F5 ctrl + alt + F6 同时按下 ...

  5. Python的压缩文件处理 zipfile & tarfile

    本文从以下两个方面, 阐述Python的压缩文件处理方式: 一. zipfile 二. tarfile 一. zipfile 虽然叫zipfile,但是除了zip之外,rar,war,jar这些压缩( ...

  6. 转 linux安装swoole扩展

    linux安装swoole扩展 发表于2年前(2014-09-03 14:05)   阅读(4404) | 评论(3) 7人收藏此文章, 我要收藏 赞2 上海源创会5月15日与你相约[玫瑰里],赶快来 ...

  7. Python 时间推进器-->在当前时间的基础上推前n天 | CST时间转化标准日期格式

    由于公司任务紧迫,好久没有在园子里写自己的心得了,今天偷个闲发表点简单的代码块,在开源的时代贡献微薄力量.话不多说,直接上代码块: ]) m = ]) d = ]) the_date = dateti ...

  8. svmtrain输入参数介绍【转】

    -s svm类型:SVM设置类型(默认0) 0 -- C-SVC 1 --v-SVC 2 – 一类SVM 3 -- e -SVR 4 -- v-SVR -t 核函数类型:核函数设置类型(默认2) 0 ...

  9. 【Python】python和json数据相互转换,json读取和写入,repr和eval()使用

    python数据转换json 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import jso ...

  10. bzoj 2140: 稳定婚姻 (二分图)

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...