描述

L 饭后无聊,便在 BugTown 里闲荡。

BugTown 共有 N 栋房屋和 M 条有向道路。每栋房屋都有一个非负整数 vi 作为标识。

BugTown 有一个特性十分神奇:从任意一个房屋离开后沿着路走再也不会回到原地。

L 想选一个房屋作为闲荡的起点,之后,他会随机选择一条当前位置能走的道路顺其 走过去,如此反复直到没有能走的道路。

由于极度无聊, L 发明了一个游戏以为消遣。他在闲荡的过程中记录已经过的房屋标 识的异或和(含起点)。闲荡完后,他会得到一个数。

L希望对每个房屋算出以它为起点能得到的数的期望值,但是他不知道怎么算,只好 求助于你。

输入

第一行两个正整数 N; M 分别为房屋数和道路数。

第二行 N 个数为 vi。

接下来 M 行每行两个整数 ai; bi 描述一条 ai 到 bi 的道路

输出

输出共 N 行。第 i 行一个实数表示以 i 号房屋为起点时最后得到的数的期望值。 实数四舍五入到小数点后三位

样例输入

3 2
1 2 3
1 2
2 3

样例输出

0.000
1.000
3.000

对于 10% 的数据, N <= 5; M <= 10。

对于 30% 的数据, N, M<= 50。

对于 70% 的数据, N, M <=1000。

对于 100% 的数据, 1 <= N,M <= 1e5; 0 <= vi <= 1e9。

----------------------------------------------------------------------------------------------

数学期望真是一个大坑!异或的相关计算也是!趁这道题复习了一下这两点。

数学期望:是试验中每次可能结果的概率乘以其结果的总和

·这是公式:

·它有两个结论:

1.E(A + B) = E(A) + E(B)

2.E(k*A) = k*E(A)

看起来没什么用,但实际上太了不起啦(23333

好的然后我们来看这道题。

先从期望入手:

设某个点的标识为k,因为题目涉及到异或,所以有

k的二进制表示:

则:

于是就转化为求E(ai)

而这时候,玄(投机)学(取巧)操作就出现了:因为ai只能为0或1,所以我们可以通过等式拆开化简来消去系数为0的项:

从此,我们将求E(ai)转化为直接求ai=1的概率,即只需要处理每个点出发得到的第i位为1的概率。

接下来我们要构造的是dp转移方程:

用f[c][d]表示从c点出发,此数位为d的概率。

枚举当前到的点u,此时数位为g,v为u的某出边,double p=1.0/出边数,以下分为两种情况:

1. u 没有出边,则有:f[u][g]=1; f[u][g^1]=0;//为g(0,1)的概率为1,为g相反的数(1,0)的概率为0

2. u有出边,则有递推式: f[u][0]+=f[v][g]*p; f[u][1]+=f[v][g^1]*p; //儿子当位为g,异或后为0,反之亦然

最后看回大局,最初应该先做一次拓扑排序,因为我们是以图的一层一层向下转移的。

就酱~

 #include<bits/stdc++.h>
#define N 100010
using namespace std;
int val[N],n,m;
struct rockdu
{
int u,v,nxt;
}e[N*];
int first[N],cnt;
int tot;
void ade(int u,int v)
{
e[++cnt].nxt=first[u];first[u]=cnt;
e[cnt].v=v;e[cnt].u=u;
}
int deg[N],seq[N],sn;
double f[N][];
double ans[N];
queue<int> q;
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&val[i]);
for(int i=;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
ade(a,b);
++deg[b];
}
for(int i=;i<=n;i++)
if(deg[i]==) q.push(i);
while(!q.empty())
{
int u=q.front(); q.pop();
seq[++sn]=u;
for(int i=first[u];i;i=e[i].nxt)
{
int v=e[i].v;
deg[v]--;
if(deg[v]==) q.push(v);
}
}
for(int i=;i<;i++)
for(int j=n;j>=;j--)
{
int u=seq[j],son=;
int g=( (val[u]>>i)& );
for(int x=first[u];x;x=e[x].nxt)
++son;//记录儿子个数
if(son==)
{
f[u][g]=1.0;
f[u][g^]=0.0;
}
else
{
double p=1.0/son;
f[u][]=f[u][]=0.0;//初始化
for(int x=first[u];x;x=e[x].nxt)
{
int v=e[x].v;
f[u][]+=f[v][g]*p;
f[u][]+=f[v][g^]*p;
}
}
ans[u]+=f[u][]*(<<i);
}
for(int i=;i<=n;i++)
printf("%.3lf\n",ans[i]);
return ;
}

要看吗ovo

 
 





SDOJ 2605 闲荡的更多相关文章

  1. sdutoj 2605 A^X mod P

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2605 A^X mod P Time Limit ...

  2. sdut 2605 A^X mod P

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2605 这个题卡的是优化,直观解法是在求x^y时 ...

  3. YTU 2605: 熟悉题型——自由设计(比较大小-类模板)

    2605: 熟悉题型--自由设计(比较大小-类模板) 时间限制: 1 Sec  内存限制: 128 MB 提交: 125  解决: 107 题目描述 声明一个类模板,利用它分别实现两个整数.浮点数和字 ...

  4. Power OJ 2605 SPFA+dp思想

    题目链接[https://www.oj.swust.edu.cn/problem/show/2605] 题意:给出包含N(N <= 5000)个点M条边的有向图,然后求1 - N在满足距离小于T ...

  5. ZJU 2605 Under Control

    Under Control Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Original ...

  6. 【洛谷2605】[ZJOI2010] 基站选址(线段树维护DP)

    点此看题面 大致题意: 有\(n\)个村庄,每个村庄有\(4\)个属性:\(D_i\)表示与村庄\(1\)的距离,\(C_i\)表示建立基站的费用,\(S_i\)表示能将其覆盖的建基站范围,\(W_i ...

  7. SDOJ 3742 黑白图

    [描述] 一个 n 个点 m 条边构成的无向带权图.由一些黑点与白点构成 树现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个,可以选 取其中任意一个),我们想要使得花费的代价最小.请问这 ...

  8. 【SDOJ 3741】 【poj2528】 Mayor's posters

    Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...

  9. SDOJ 3740 Graph

    8.9 t3 [描述] 给你一个图,一共有 N 个点,2*N-2 条有向边. 边目录按两部分给出 1. 开始的 n-1 条边描述了一颗以 1 号点为根的生成树,即每个点都可以由 1 号点 到达. 2. ...

随机推荐

  1. filter和map的使 使得数组对象变数组

    let UnitList = this.paytypeData.filter( item => item.CheckBox === true ).map(axis => axis.Unit ...

  2. String | StringBuffer | StringBuilder 比较

    2016的第一天,我决定写一篇博客来纪念这一天,希望一年好运吧. String|StringBuffer|StringBuilder这三者在我们学习JAVASE核心API的时候常常出来,而且大多数入门 ...

  3. SVN合并步骤

    1.trunk->branch/tag 分支路径在分支文件夹中,选择右键检出 2.合并分支到主干分支新增 1.txt 文件 需要合并到主干 在trunck->鼠标右键合并->合并到不 ...

  4. basic ,fundamental ,extreme ,utmost和radical.区别

    basic 普通用词,指明确.具体的基础或起点.fundamental 书面用词,不如basic使用广泛,侧重指作为基础.根本的抽象的事物.radical 着重指事物的根本或其来源.下面是extrem ...

  5. method 'redisConnectionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError

    spring boot 整合redis是报了如下错误 org.springframework.beans.factory.UnsatisfiedDependencyException: Error c ...

  6. springboot 测试

    本次测试使用的是springboot 中的测试 1.(对service 的测试)下面的测试.将会启动容器进行测试 @RunWith(SpringRunner.class) @SpringBootTes ...

  7. webpack配置指南

    Webpack已经出来很久了,相关的文章也有很多,然而比较完整的例子却不是很多,让很多新手不知如何下脚,下脚了又遍地坑 说实话,官方文档是蛮乱的,而且有些还是错的错的..很多配置问题只有爬过坑才知道 ...

  8. C++内存溢出和内存泄漏?

    1.内存溢出 内存溢出是指程序在申请内存时没有足够的内存空间供其使用.原因可能如下: (1)内存中加载的数据过于庞大: (2)代码中存在死循环: (3)递归调用太深,导致堆栈溢出等: (4)内存泄漏最 ...

  9. Vue 后台管理

    这里是结合vue和element快速成型的一个demo 里面展示了基本的后台管理界面的大体结构和element的基本操作 GitHub的地址:https://github.com/wwwming/ad ...

  10. Mysql查询指定用户并列排名 类似rank函数

    SELECT total.* FROM ( SELECT obj.uid, obj.score, CASE WHEN @rowtotal = obj.score THEN @rownum WHEN @ ...