描述

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. Bibtex使用介绍

    BibTeX 是一种格式和一个程序, 用于协调LaTeX的参考文献处理. BibTeX 使用数据库的的方式来管理参考文献. BibTeX 文件的后缀名为 .bib . 先来看一个例子 @article ...

  2. uvm_reg_predictor——寄存器模型(十一)

    保存寄存器的值 观察DUT寄存器值的变化. //---------------------------------------------------------------------------- ...

  3. 解决首次在eclipse中使用maven构建hadoop等项目时报Missing artifact sun.jdk:tools:jar:1.5.0的问题

    问题原因: eclipse中的maven插件默认没有引用环境变量,所以找不到jdk的路径,也就找不到tool.jar. 解决办法: 步骤如下: 1.关闭eclips 2.在eclipse的解压目录中与 ...

  4. Hadoop 2.7.0模拟分布式实验环境搭建[亲测]

    实验目的: 本实验通过在PC电脑上同时运行3个虚拟机,一个为master节点,两个slave节点.    搭建环境: 主机:mac os 10.10   OS:CenOS 6.5 虚拟机:VMware ...

  5. SAP数据中心概述

    文章目录 SAP数据中心内部的组成部分 SAP数据中心的安全性 SAP数据中心的绿色运营 SAP云平台编程环境 Jerry的前一篇文章企业数字化转型与SAP云平台介绍了SAP云平台在企业数字化转型中的 ...

  6. Round #322 (Div. 2) 581D Three Logos (模拟)

    先枚举两个矩形,每个矩形横着放或竖着放,把一边拼起来, 如果不是拼起来有缺口就尝试用第三个矩形去补. 如果没有缺口就横着竖着枚举一下第三个矩形和合并的矩形x或y拼接. #include<bits ...

  7. Problem T: 结构体--学生信息排序

    Problem T: 结构体--学生信息排序 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 2219  Solved: 1305[Submit][Sta ...

  8. python_93_面向对象实例2

    class Role: def __init__(self,name,role,weapon,life_value=100,money=15000): '构造函数:实例化时做一些类的初始化工作' se ...

  9. Win10激活方法(企业版)

    Win10激活 注意:以管理员身份运行,需要电脑有网(亲测激活企业版没问题) 然后一条一条复制执行 slmgr /ipk NPPR9-FWDCX-D2C8J-H872K-2YT43 slmgr /sk ...

  10. WINDOWS-基础:Thread.Sleep(0)

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用 ...