SDOJ 2605 闲荡
描述
L 饭后无聊,便在 BugTown 里闲荡。
BugTown 共有 N 栋房屋和 M 条有向道路。每栋房屋都有一个非负整数 vi 作为标识。
BugTown 有一个特性十分神奇:从任意一个房屋离开后沿着路走再也不会回到原地。
L 想选一个房屋作为闲荡的起点,之后,他会随机选择一条当前位置能走的道路顺其 走过去,如此反复直到没有能走的道路。
由于极度无聊, L 发明了一个游戏以为消遣。他在闲荡的过程中记录已经过的房屋标 识的异或和(含起点)。闲荡完后,他会得到一个数。
L希望对每个房屋算出以它为起点能得到的数的期望值,但是他不知道怎么算,只好 求助于你。
输入
第一行两个正整数 N; M 分别为房屋数和道路数。
第二行 N 个数为 vi。
接下来 M 行每行两个整数 ai; bi 描述一条 ai 到 bi 的道路
输出
输出共 N 行。第 i 行一个实数表示以 i 号房屋为起点时最后得到的数的期望值。 实数四舍五入到小数点后三位
样例输入
1 2 3
1 2
2 3
样例输出
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 闲荡的更多相关文章
- sdutoj 2605 A^X mod P
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2605 A^X mod P Time Limit ...
- sdut 2605 A^X mod P
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2605 这个题卡的是优化,直观解法是在求x^y时 ...
- YTU 2605: 熟悉题型——自由设计(比较大小-类模板)
2605: 熟悉题型--自由设计(比较大小-类模板) 时间限制: 1 Sec 内存限制: 128 MB 提交: 125 解决: 107 题目描述 声明一个类模板,利用它分别实现两个整数.浮点数和字 ...
- Power OJ 2605 SPFA+dp思想
题目链接[https://www.oj.swust.edu.cn/problem/show/2605] 题意:给出包含N(N <= 5000)个点M条边的有向图,然后求1 - N在满足距离小于T ...
- ZJU 2605 Under Control
Under Control Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on ZJU. Original ...
- 【洛谷2605】[ZJOI2010] 基站选址(线段树维护DP)
点此看题面 大致题意: 有\(n\)个村庄,每个村庄有\(4\)个属性:\(D_i\)表示与村庄\(1\)的距离,\(C_i\)表示建立基站的费用,\(S_i\)表示能将其覆盖的建基站范围,\(W_i ...
- SDOJ 3742 黑白图
[描述] 一个 n 个点 m 条边构成的无向带权图.由一些黑点与白点构成 树现在每个白点都要与他距离最近的黑点通过最短路连接(如果有很多个,可以选 取其中任意一个),我们想要使得花费的代价最小.请问这 ...
- 【SDOJ 3741】 【poj2528】 Mayor's posters
Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral electio ...
- SDOJ 3740 Graph
8.9 t3 [描述] 给你一个图,一共有 N 个点,2*N-2 条有向边. 边目录按两部分给出 1. 开始的 n-1 条边描述了一颗以 1 号点为根的生成树,即每个点都可以由 1 号点 到达. 2. ...
随机推荐
- filter和map的使 使得数组对象变数组
let UnitList = this.paytypeData.filter( item => item.CheckBox === true ).map(axis => axis.Unit ...
- String | StringBuffer | StringBuilder 比较
2016的第一天,我决定写一篇博客来纪念这一天,希望一年好运吧. String|StringBuffer|StringBuilder这三者在我们学习JAVASE核心API的时候常常出来,而且大多数入门 ...
- SVN合并步骤
1.trunk->branch/tag 分支路径在分支文件夹中,选择右键检出 2.合并分支到主干分支新增 1.txt 文件 需要合并到主干 在trunck->鼠标右键合并->合并到不 ...
- basic ,fundamental ,extreme ,utmost和radical.区别
basic 普通用词,指明确.具体的基础或起点.fundamental 书面用词,不如basic使用广泛,侧重指作为基础.根本的抽象的事物.radical 着重指事物的根本或其来源.下面是extrem ...
- method 'redisConnectionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError
spring boot 整合redis是报了如下错误 org.springframework.beans.factory.UnsatisfiedDependencyException: Error c ...
- springboot 测试
本次测试使用的是springboot 中的测试 1.(对service 的测试)下面的测试.将会启动容器进行测试 @RunWith(SpringRunner.class) @SpringBootTes ...
- webpack配置指南
Webpack已经出来很久了,相关的文章也有很多,然而比较完整的例子却不是很多,让很多新手不知如何下脚,下脚了又遍地坑 说实话,官方文档是蛮乱的,而且有些还是错的错的..很多配置问题只有爬过坑才知道 ...
- C++内存溢出和内存泄漏?
1.内存溢出 内存溢出是指程序在申请内存时没有足够的内存空间供其使用.原因可能如下: (1)内存中加载的数据过于庞大: (2)代码中存在死循环: (3)递归调用太深,导致堆栈溢出等: (4)内存泄漏最 ...
- Vue 后台管理
这里是结合vue和element快速成型的一个demo 里面展示了基本的后台管理界面的大体结构和element的基本操作 GitHub的地址:https://github.com/wwwming/ad ...
- Mysql查询指定用户并列排名 类似rank函数
SELECT total.* FROM ( SELECT obj.uid, obj.score, CASE WHEN @rowtotal = obj.score THEN @rownum WHEN @ ...