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. ...
随机推荐
- 20170405JDBC数据查询
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- struts2 ognl表达式访问值栈
1:简单的说,值栈是对应每一个请求对象的轻量级的数据存储中心,在这里统一管理着数据,供Action.Result.Interceptor等Struts2的其他部分使用,这样数据被集中管理起来而不凌乱. ...
- iOS 应用架构 (三)
iOS 客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答 iOS 应用架构中的种种问题,本文是其中的第二篇,主要讲 View 层的组织和调用方案.下篇主要讨论做 Vi ...
- epoll使用总结
epoll的使用总结 使用epoll来实现一个tcp server,中间碰到了不少使用细节上的问题,总结一下. man epoll里推荐的使用方法 epoll使用代码 #define MAX_EVEN ...
- 大家一起和snailren学java-(序)
由于最近在面试实习的时候,发现自己的java基础还是不是特别的扎实.因此再重新深入学习一下java.每天学习一点,都能进步一些. 用书<Thinking in java><effec ...
- GoAccess自动分割Nginx日志
GoAccess 是一款开源的网站日志实时分析工具.GoAccess 的工作方式很容易理解,就是读取和解析 Apache/Nginx/Lighttpd 的访问日志文件 access log,然后以更友 ...
- ComboBox控件“设置 DataSource 属性后无法修改项集合”的解决【转】
编写Winform程序,遇到comboBox的绑定事件和索引项变更事件的冲突问题,就是“设置 DataSource 属性后无法修改项集合”的错误问题,网上查了很多,大多说在索引项变更是进行非空判断,还 ...
- miniLCD12864 16引脚
显示图片 main.c #include<reg51.h>#include"st7565.h"//---存一个图片--//unsigned char code pic[ ...
- Caused by: java.lang.IllegalStateException: javax.websocket.server.ServerContainer not available
java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.co ...
- UVA 10570 Meeting with Aliens 外星人聚会
题意:给你一个排列,每次可以交换两个整数(不一定要相邻),求最少交换次数把排列变成一个1~n的环形排列.(正反都算) 其实就是找环了,对于一个链状序列,最小交换次数等于不在对应位置的数字个数减去环的个 ...