描述

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. HttpServeletRequest

    一.HttpServeletRequest 接口(javax.servlet.http) 定义:public interface HttpServletRequestextends ServletRe ...

  2. JFinal教程:JFinal极速开发企业实战百集JFinal视频教程发布

    课程名称:JFinal极速开发企业实战 课程长度:100课时 课程作者:小木(909854136) 课程地址:http://edu.csdn.net/course/detail/1968 官网网址:h ...

  3. python 之正则表达式

    一.正则表达式 首先,我们需要感性的了解下什么是正则表达式,简单的是说“正则表达式”就是一个“表达式”,更准确定义是:“用一个简洁的方法来实现对“一组字符串”的表达式. 最终目的就是实现“一行胜千言” ...

  4. userBean的删除

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  5. UVA 10037 Bridge (基础DP)

    题意: 过河模型:有n个人要渡河,每个人渡河所耗时可能不同,只有1只船且只能2人/船,船速取决于速度慢的人.问最少耗时多少才能都渡完河? 思路: n<2的情况比较简单. 考虑n>2的情况, ...

  6. python基础之基本数据类型

    1.int 整数 2.bool 布尔 3.str 字符串,一般放小量数据 4.list 列表,可以存放大量的数据 5.dict字典,以key:value的形式存储数据 6.set集合(数学) 7.tu ...

  7. 传输途径 ath9k层到硬件层

    这里只写了ath9k层到虚拟硬件层的一些东西,mac层的没有整理. 传输途径主要从ath9k_tx() --->ath_tx_start() --->ath_tx_send_normal( ...

  8. C#算术运算符

    一.C#算术运算符 C#语言的算术运算符主要用于数学计算中. 二.示例 using System;using System.Collections.Generic;using System.Linq; ...

  9. js中实现杨辉三角

    实现效果:杨辉三角 即: 提示用户输入要实现的杨辉三角行数: 请输入杨辉三角的行数: 8 代码实现后的效果如下: 1 1.1 1.2.1 1.3.3.1 1.4.6.4.1 1.5.10.10.5.1 ...

  10. 转 Anaconda启动卡死的解决方案

    https://blog.csdn.net/meng_zhi_xiang/article/details/83651676