BZOJ2337: [HNOI2011]XOR和路径(高斯消元,期望)
解题思路:
Xor的期望???怕你不是在逗我。
按为期望,新技能get
剩下的就是游走了。
代码:
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 struct pnt{ 6 int hd; 7 int ind; 8 }p[101]; 9 struct ent{ 10 int twd; 11 int lst; 12 int vls; 13 }e[30001]; 14 double a[201][201]; 15 int cnt; 16 int n,m; 17 void ade(int f,int t,int v) 18 { 19 cnt++; 20 e[cnt].vls=v; 21 e[cnt].twd=t; 22 e[cnt].lst=p[f].hd; 23 p[f].hd=cnt; 24 p[f].ind++; 25 return ; 26 } 27 void G_(void) 28 { 29 for(int i=1;i<=n;i++) 30 { 31 int h=i; 32 for(int j=i+1;j<=n;j++)if(fabs(a[h][i])<fabs(a[j][i]))h=j; 33 if(h!=i)for(int j=i;j<=n+1;j++)std::swap(a[i][j],a[h][j]); 34 for(int j=i+1;j<=n;j++) 35 { 36 double s=a[j][i]/a[i][i]; 37 for(int k=i;k<=n+1;k++)a[j][k]-=a[i][k]*s; 38 } 39 } 40 for(int i=n;i>1;i--) 41 { 42 for(int j=i-1;j>0;j--) 43 { 44 a[j][n+1]-=a[i][n+1]/a[i][i]*a[j][i]; 45 } 46 } 47 return ; 48 } 49 int main() 50 { 51 // freopen("a.in","r",stdin); 52 scanf("%d%d",&n,&m); 53 for(int i=1;i<=m;i++) 54 { 55 int a,b,c; 56 scanf("%d%d%d",&a,&b,&c); 57 ade(a,b,c);if(a!=b)ade(b,a,c); 58 } 59 double ans=0; 60 for(int i_=0;(1ll<<i_)<=(long long)(1e9);i_++) 61 { 62 memset(a,0,sizeof(a)); 63 for(int i=1;i<=n;i++) 64 { 65 a[i][i]=p[i].ind;if(i==n)continue; 66 for(int i__=p[i].hd;i__;i__=e[i__].lst) 67 { 68 int j=e[i__].twd; 69 if(e[i__].vls&(1<<i_))a[i][j]+=1.00,a[i][n+1]+=1.00; 70 else a[i][j]-=1.00; 71 } 72 } 73 G_();double ps=a[1][n+1]/a[1][1]; 74 ans+=ps*(1ll<<i_); 75 } 76 printf("%.3lf\n",ans); 77 return 0; 78 }