2337: [HNOI2011]XOR和路径

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1170  Solved: 683

Description

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、高斯消元)的更多相关文章

  1. [HNOI2011]XOR和路径 概率期望 高斯消元

    题面 题解:因为异或不太好处理,,,因此按位来算,这样最后的答案就是每一位上的值乘对应的权值再求和.本着期望要倒退的原则,,,我们设$f[i]$表示从$i$到$n$,xor和为1的概率.那么观察$xo ...

  2. 【BZOJ2337】[HNOI2011]XOR和路径 期望DP+高斯消元

    [BZOJ2337][HNOI2011]XOR和路径 Description 题解:异或的期望不好搞?我们考虑按位拆分一下. 我们设f[i]表示到达i后,还要走过的路径在当前位上的异或值得期望是多少( ...

  3. BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元

    大前提,把两个点的组合看成一种状态 x 两种思路 O(n^7) f[x]表示在某一个点的前提下,这个状态经过那个点的概率,用相邻的点转移状态,高斯一波就好了 O(n^6) 想象成臭气弹,这个和那个的区 ...

  4. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  5. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  6. LightOJ - 1151概率dp+高斯消元

    概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...

  7. BZOJ3270 博物館 概率DP 高斯消元

    BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...

  8. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  9. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...

  10. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

随机推荐

  1. [SDOI2010]外星千足虫 题解 高斯消元+bitset简介

    高斯消元 + bitset 简介: 高斯消元其实就是以加减消元为核心求唯一解.这道题还是比较裸的,可以快速判断出来.我们将每一只虫子看作一个未知数,这样根据它给出的 m 组方程我们可以高斯消元得出每一 ...

  2. 函数嵌套>作用域>闭包函数

    一:函数对象 函数是第一类对象,即表示函数可以当做数据传递 可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则. 可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作 ...

  3. c语言学习笔记.链表.

    链表: 链表单个节点的数据结构.链表的实现主要依靠结构体和指针. 头指针(head)指向链表的第一个节点,然后第一个节点中的指针指向下一个节点,然后依次指到最后一个节点,这样就构成了一条链表. str ...

  4. console.dir() 与 console.dirxml() 的使用

    在调试JavaScript程序时,有时需要dump某些对象的详细信息.通过手工编写JavaScript代码可以完成这一工作:针对对象的属性进行循环,将循环到的每一个属性值打印出来:可见,这一过程是比较 ...

  5. margin-bottom无效问题以及div里内容动态居中样式!

    最近调前端样式时候,遇到一个需求,在中间文字不对等的情况下想让下面的操作文字距离底部对齐,如图: , 刚开始觉得使用margin-bottom就可以,后来发现只有margin-top是管用的,查了资料 ...

  6. KVM,QEMU,libvirt入门学习笔记【转】

    转自:http://blog.csdn.net/julykobe/article/details/27571387 注:本文内容均来自网络,我只是在此做了一些摘抄和整理的工作,来源均有注明. 0.虚拟 ...

  7. APUE-文件和目录(八)文件时间

    文件的时间 与文件相关的三个时间值: 访问时间:最后一次访问文件的时间.例如,cat命令会修改这个时间. 修改时间:文件内容最后一次被修改的时间. 状态更改时间:文件的i节点最后一次被修改的时间.例如 ...

  8. [How to] Phoenix 与 CDH5.4.2 HBase的整合

    1.简介 Phoenix将SQL带回到了NOSQL的世界,其在HBase之上做了一个layer,客户端通过SQL调用Phoenix,Phoenix在转化为HBase客户算API进行访问HBase,其很 ...

  9. window.onload绑定多个事件 —— 两种解决方案

    前言 有些函数,必须在网页加载完毕后执行.比如:涉及DOM操作的. 网页加载完毕时会触发一个onload事件,将函数绑定到这个事件上即可. window.onload = myFunction; 问题 ...

  10. C# listView subitem 问本值 text 改变 界面会闪烁

    解决方法 就是重写ListView,然后设置双缓冲即可,然后再使用DoubleBufferListView,就不会闪烁了.下面的代码是DoubleBufferListView,并使用FrmMain来测 ...