【BZOJ 2337】 2337: [HNOI2011]XOR和路径(概率DP、高斯消元)
2337: [HNOI2011]XOR和路径
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1170 Solved: 683Description
Input
Output
Sample Input
Sample Output
HINT
Source
【分析】
这题终于自己打出来了高斯消元。没有对比代码了。。。
很心酸啊。。调试的时候是完全没有方向的,高斯消元还要自己一步步列式子然后消元解。。【为什么错都不知道有时候
这题显然是不能直接记录异或和然后DP的。
显然是要拆位的。
拆位之后f[i][0]表示从i走,走到终点,这一位异或和为0的概率。
f[i][0]=f[j][0]*p (i->j 这一位边权为0)+f[j][1]*p (i->j 这一位边权为1)
反之不写了
f[n][0]=1 f[n][1]=0
就是(2*n)^2规模的高斯消元。
然后用f[1][1]乘这一位的贡献加进答案里面就好。
一开始被卡精,eps太小,后来数组爆一位!!醉了!!
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 110
#define Maxm 10010
const double eps=1e-; struct node
{
int x,y,c,next;
}t[Maxm*];
int first[Maxn],len;
double d[Maxn];
void ins(int x,int y,int c)
{
d[x]+=1.0;
t[++len].x=x;t[len].y=y;t[len].c=c;
t[len].next=first[x];first[x]=len;
} bool dcmp(double x) {return fabs(x)>eps;} double a[*Maxn][*Maxn],f[*Maxn];
void gauss(int n)
{
for(int i=;i<n;i++)
{
// if(a[i][i]==0) continue;
int t=i;
for(int j=i+;j<=n;j++) if(fabs(a[j][i])>fabs(a[t][i])) t=j;
if(t!=i)
{
for(int j=;j<=n;j++) swap(a[i][j],a[t][j]);
}
for(int j=i+;j<=n;j++)
{
double t=a[j][i]/a[i][i];
if(dcmp(a[j][i]))
{
for(int k=;k<=n;k++) a[j][k]-=a[i][k]*t;
}
}
}
for(int i=n-;i>=;i--)
{
for(int j=i+;j<n;j++) a[i][n]+=f[j]*a[i][j];
f[i]=-a[i][n]/a[i][i];
}
} int main()
{
int n,m,mx=;
scanf("%d%d",&n,&m);
len=;memset(first,,sizeof(first));
for(int i=;i<=n;i++) d[i]=;
for(int i=;i<=m;i++)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
mx=max(mx,c);
ins(x,y,c);
if(x!=y) ins(y,x,c);
}
int l=;while((<<l)<=mx) l++;
double ans=;
for(int i=;i<=l;i++)
{
for(int j=;j<=n+n;j++) for(int k=;k<=n+n;k++) a[j][k]=;
for(int j=;j<n;j++)
{
a[j][j]=1.0;a[j+n][j+n]=1.0;
for(int k=first[j];k;k=t[k].next)
{
int y=t[k].y;
if(t[k].c&(<<i)) a[j][y+n]-=1.0/d[j],a[j+n][y]-=1.0/d[j];
else a[j][y]-=1.0/d[j],a[j+n][y+n]-=1.0/d[j];
}
a[j][(n<<)+]=a[j+n][(n<<)+]=;
}
a[n][n]=1.0;a[n+n][n+n]=1.0;
a[n][(n<<)+]=-1.0;a[n<<][(n<<)+]=;
gauss((n<<)+);
// printf("%.10lf\n",f[n+1]);
ans+=1.0*(<<i)*f[n+];
}
printf("%.3lf\n",ans);
return ;
}
【怎么说回家前A掉这题还是很兴奋的
【也说明我能自己打出概率的高斯消元了耶!
2017-04-22 16:06:09
【BZOJ 2337】 2337: [HNOI2011]XOR和路径(概率DP、高斯消元)的更多相关文章
- [HNOI2011]XOR和路径 概率期望 高斯消元
题面 题解:因为异或不太好处理,,,因此按位来算,这样最后的答案就是每一位上的值乘对应的权值再求和.本着期望要倒退的原则,,,我们设$f[i]$表示从$i$到$n$,xor和为1的概率.那么观察$xo ...
- 【BZOJ2337】[HNOI2011]XOR和路径 期望DP+高斯消元
[BZOJ2337][HNOI2011]XOR和路径 Description 题解:异或的期望不好搞?我们考虑按位拆分一下. 我们设f[i]表示到达i后,还要走过的路径在当前位上的异或值得期望是多少( ...
- BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元
大前提,把两个点的组合看成一种状态 x 两种思路 O(n^7) f[x]表示在某一个点的前提下,这个状态经过那个点的概率,用相邻的点转移状态,高斯一波就好了 O(n^6) 想象成臭气弹,这个和那个的区 ...
- BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元
BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...
- 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元
题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...
- LightOJ - 1151概率dp+高斯消元
概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...
- BZOJ3270 博物館 概率DP 高斯消元
BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...
- BZOJ 3270: 博物馆 [概率DP 高斯消元]
http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...
- 【BZOJ3640】JC的小苹果 概率DP+高斯消元
[BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...
- 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径
2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 682 Solved: 384[Submit][Stat ...
随机推荐
- 【译】第十一篇 Integration Services:日志记录
本篇文章是Integration Services系列的第十一篇,详细内容请参考原文. 简介在前一篇,我们讨论了事件行为.我们分享了操纵事件冒泡默认行为的方法,介绍了父子模式.在这一篇,我们会配置SS ...
- sql_injection之基本get注入
1.代码篇 <?php error_reporting(0); include("../conn.php"); if(isset($_GET['id'])){ $id=$_G ...
- 【技巧总结】Penetration Test Engineer[2]-Information gathering
2.信息收集 信息收集是属于前期交互阶段所需要了解的问题. 2.1.前期交互内容 签署授权文件:首要要和受测试方签订授权协议. 划定范围:指定了一个二级域名作为测试目标,那么其他二级域名在测试范围内. ...
- select()函数用法二
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序 ...
- Git log diff config高级进阶
Git 历史相关和 git config 高级进阶 前一段时间分享了一篇<更好的 git log>简要介绍怎么美化 git log 命令,其中提到了 alias命令,今天再继续谈谈 git ...
- ZOJ 3962 Seven Segment Display(数位DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3962 题目大意: 有t组数据. 给你一个n,和8位的十六进制数s ...
- 浅谈C、C++及其区别、兼容与不兼容
一.闲说C C语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而 B语言则源自BCPL语言. 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是 ...
- C# TabControl 隐藏标签头(TabControl Hide Head)
TabControl控件,有时候需要动态显示一个或者多个标签页,如果只是显示一个标签页的时候不想显示标签头,所以有可能隐藏头部的需求. 如下代码可以实现 public Form1() { Initia ...
- sicily 1198. Substring (递归全排列+排序)
DescriptionDr lee cuts a string S into N pieces,s[1],…,s[N]. Now, Dr lee gives you these N sub-strin ...
- day1作业二:多级菜单操作(函数实现)
作业二:多级菜单 (1)三级菜单 (2)可以次选择进入各子菜单 (3)所需新知识点:列表.字典 要求:输入back返回上一层,输入quit退出整个程序 本示例的三级菜单是一个yaml文件格式,格式如下 ...
