【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 ...
随机推荐
- MySQL Sakila样本数据库
Sakila样本数据库介绍 Sakila样本数据库是MySQL官方提供的一个模拟DVD租赁信息管理的数据库,提供了一个标准模式,可作为书中例子,教程.文章.样品,等等,对学习测试来说是个不错的选择. ...
- java矩阵包jama的简单操作
本文转自http://www.cnblogs.com/zangbo/p/5622351.html 一.jama简介 Jama是一个基本的线性代数java包.包括一个基本的Matrix类和5个矩阵分解类 ...
- windows 身份登录(vs设置)
如果您的项目是windows身份严重,前提是我们用域账户登录,不用单独做登录页功能了. 一.如果用IE访问方法: 进入:工具-Internet选项-安全-自定义级别,如下设置即可. 二.如果用Visu ...
- 跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险
跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险 跨站请求伪造(Cross-Site Request Forgery)或许是最令人难以理解的一种攻击方式了,但也正因如此,它的危险性也被人们所低估 ...
- 触发器Demo
--mysql 触发器简单实例 --创建表1 )) ; --创建表2 )); --创建触发器,表一增加数据时,表二自动增加数据 create trigger t_afterinsert_on_tab1 ...
- Chapter 4 深入理解Caffe MNIST DEMO中的LeNet网络模型
明代思想家王阳明提出了"知行合一",谓认识事物的道理与在现实中运用此道理,是密不可分的一回事.我以为这样的中国哲学话语,对于学习者来说,极具启发意义,要细细体会.中华文明源远流长, ...
- 【Python学习笔记】使用python进行kmeans聚类
使用python进行kmeans聚类 假设我们要解决一个这样的问题. 以下是一些同学,大萌是一个学霸,而我们想要找到这些人中的潜在学霸,所以我们要把这些人分为两类--学霸与非学霸. 高数 英语 Pyt ...
- Pytorch自定义数据库
1)前言 虽然torchvision.datasets中已经封装了好多通用的数据集,但是我们在使用Pytorch做深度学习任务的时候,会面临着自定义数据库来满足自己的任务需要.如我们要训练一个人脸关键 ...
- Gradle详解
一.脚本文件(build.gradle) 项目与脚本文件 当我们执行gradle命令的时候,Gradle会在你执行命令的目录下寻找一个名为build.gradle的文件,这个文件就是Gradle的脚 ...
- Runtime.getRuntime().exec 类 防止阻塞
import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; impor ...