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
假设第i个女性,匹配第j个男性,总共有k个可以匹配
p(i,j)=(1-p)j-1*p+(1-p)k*(1-p)j-1*p+......
套用等比求和:
S=A(1-qn)/(1-q)
因为n为无穷大,所以qn≈0
所以S≈A/(1-q)
这里A=(1-p)j-1*p,q=(1-p)k
求出每条匹配边的概率,然后倒序处理
从后往前处理一个女性i,枚举指向v边,查w(i,v)*(i+1~n,1~v-1)的概率和
显然可以树状数组,先查询比v小的概率和,再把每条边的概率插入
复杂度O(mlogn)
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct ZYYS
{
int u,v;
double d;
}e[];
struct Node
{
int next,to;
double dis;
}edge[];
double ans,p,c[];
int num,head[],n,m,du[],l[];
bool cmp(ZYYS a,ZYYS b)
{
if (a.u==b.u) return a.v<b.v;
return a.u>b.u;
}
double qpow(double x,int y)
{
double res=1.0;
while (y)
{
if (y&) res=res*x;
x=x*x;
y/=;
}
return res;
}
void add(int u,int v,double d)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
edge[num].dis=d;
}
void update(int x,double d)
{
while (x<=n)
{
c[x]+=d;
x+=(x&(-x));
}
}
double query(int x)
{
double s=;
while (x)
{
s+=c[x];
x-=(x&(-x));
}
return s;
}
int main()
{int i,u,v,j;
cin>>n>>m;
cin>>p;
for (i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
e[i].u=u;e[i].v=v;
du[u]++;
}
sort(e+,e+m+,cmp);
for (i=;i<=m;i++)
{
l[e[i].u]++;
e[i].d=qpow(-p,l[e[i].u]-)*p;
e[i].d/=-qpow(-p,du[e[i].u]);
add(e[i].u,e[i].v,e[i].d);
}
for (i=n;i>=;i--)
{
for (j=head[i];j;j=edge[j].next)
{
int v=edge[j].to;
ans+=edge[j].dis*query(v-);
}
for (j=head[i];j;j=edge[j].next)
{
int v=edge[j].to;
update(v,edge[j].dis);
}
}
printf("%.2lf\n",ans);
}

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

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

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

  2. Bzoj4481 [Jsoi2015]非诚勿扰

    Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 147  Solved: 75 Description [故事背景] JYY赶上了互联网创业的大潮,为非 ...

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

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

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

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

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

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

  6. bzoj AC倒序

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

  7. 「JSOI2015」非诚勿扰

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

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

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

  9. JSOI2015 Round1——完挂

    感觉眼前天地转了转…… Day 0 和zxy,zyh一同坐车去扬中,同行的还有llr 路上zyh基本在睡觉…… 入住的宾馆各种坑爹,同一层住的两个房间一个有网一个没网 我有幸入住了有网的房间,zyh在 ...

随机推荐

  1. 解决fiddler无法抓取本地部署项目的请求问题

    在本地部署了几个应用,然后想用fiddler抓取一些请求看看调用了哪些接口,然鹅,一直抓不到... 比如访问地址是这样的: 在网上搜罗半天,找到一个解决方法 在localhost或127.0.0.1后 ...

  2. 通过cmd命令行连接mysql数据库

    找到 mysqld.exe所在的路径 使用cd切换到msyqld.exe路径下 输入mysql连接命令,格式如下 Mysql  -P 端口号  -h  mysql主机名\ip -u root (用户) ...

  3. C语言博客作业—结构体

    一.PTA实验作业 题目1:结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 void calc //函数calc求出p指针所指的结构体数组中 n 名学生各自的总分 { 定义循环变量i: ...

  4. Beta冲刺-用户测试报告

    一.项目概述 1.1项目名称 高校学生征信系统 1.2项目简介 此项目基于SSH框架,力图为学生提供征信服务和信用相关的借款和申请活动.其中以信用统计和管理为主,信用使用为辅,构建出一个集信用收集和使 ...

  5. 需求分析&原型设计

    需求分析&原型设计 需求分析 访问软件项目真实用户 首先本项目的用户是这个需要做简单四则运算的用户(我们团队通过对家里有三四年级小学生(需要做简单四则运算)的简单采访):反映了几个主要的问题: ...

  6. 开启Linux的share

    1.挂载Install  Vmare Tool 2.解压VMwareTools.tar.gz 3.安装share目录 4.shared Folders Enabled 添加共享的目录. 在自己的Unb ...

  7. splinter web测试框架

    1.安装谷歌浏览器驱动(windows把驱动解压放在Python.exe同级目录即可) http://chromedriver.storage.googleapis.com/index.html 注意 ...

  8. bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司

    http://www.lydsy.com/JudgeOnline/problem.php?id=1568 写多了就觉着水了... #include<cstdio> #include< ...

  9. 如何书写高效的css样式

    如何书写高效的css样式? 有以下四个关键要素: 1.高效的css 2.可维护的css 3.组件化的css 4.hack-free  css 书写高效的css: 1.使用外联样式替代行间样式或内嵌样式 ...

  10. javascript中数组的深拷贝的方法

    一.什么是浅拷贝 在js当中,我们常常遇到数组复制的的情况,许多人一般都会使用"="来直接把一个数组赋值给一个变量,如 var a=[1,2,3]; var b=a; consol ...