【xsy1201】 随机游走 高斯消元
题目大意:你有一个$n*m$的网格(有边界),你从$(1,1)$开始随机游走,求走到$(n,m)$的期望步数。
数据范围:$n≤10$,$m≤1000$。
我们令 $f[i][j]$表示从$(1,1)$随机游走到$(i,j)$的期望步数。不难推出:
如果$(i,j)$与边界不想邻,则有 $f[i][j]=\frac{1}{4}(f[i-1][j]+f[i+1][j]+f[i][j-1]+f[i][j+1])+1$
如果$(i,j)$与边界相邻,但不在四个角,则把式子中的$\frac{1}{4}$改为$\frac{1}{3}$,并且将括号中的四个项删掉一个。
如果$(i,j)$在非起点的三个角上,则式子也显然。
显然这是一个$nm$元一次方程,我们可以考虑用高斯消元在$O(n^3m^3)$的时间内完成求解,这样子可以拿到$50$分的好成绩。
我们令$x_{(i-1)m+j}$来表示$f[i][j]$。
那么式子就变成了$x_i=\frac{1}{4}(x_{i-1}+x_{i+1}+x_{i+m}+x_{i-m})+1$
然后我们会发现,第$i$条式子只有$[i-m,i+m]$是有值的。
根据高斯消元的特征,第i条式子中包含$x_{[i-m,i)}$的项值会被消掉,那么实际上存在项的部分为$x_{[m,i+m]}$。
我们又发现,式子中包含$x_i$的,只可能第$i-m$条式子至第$i+m$条式子。
那么,我们在高斯消元时,并不需要把对所有式子进行处理,只需要处理第$i$条式子的后$m$条式子的第$i$项至第$i+m$项即可。
时间复杂度降低至$O(nm^3)$,你可以得到$80$分的好成绩。
考虑到$m$很大,依然无法求解,考虑到$n$很小,我们将$n$和$m$进行$swap$,然后再去求解即可。
时间复杂度降低至$O(n^3m)$。可以得到$100$分的好成绩。
#include<bits/stdc++.h>
#define M 10005
#define ok(x,y) (1<=(x)&&(x)<=n&&1<=(y)&&(y)<=m)
#define ok2(x,y) (ok(x,y)&&(!(x==1&&y==1)))
#define D double
using namespace std; D *a[M];int n,m; D get(int i,int j){
D hh=;
if(ok(i-,j)) hh++;
if(ok(i+,j)) hh++;
if(ok(i,j+)) hh++;
if(ok(i,j-)) hh++;
return /hh;
} void newhh(int x){
int i=(x-)/m+,j=(x-)%m+;
a[x]=new D[n*m+];
memset(a[x],,sizeof(D)*(n*m+));
D hh=get(i,j);
if(ok2(i-,j)) a[x][x-m]=-hh;
if(ok2(i+,j)) a[x][x+m]=-hh;
if(ok2(i,j+)) a[x][x+]=-hh;
if(ok2(i,j-)) a[x][x-]=-hh;
a[x][x]=; a[x][n*m+]=;
} int Main(){
scanf("%d%d",&n,&m);
if(n==&&m==) {printf("0\n"); return ;}
if(m>n) swap(n,m);
for(int i=;i<=m+;i++) newhh(i);
for(int i=;i<n*m;i++){
for(int j=i+;j<=min(i+m,n*m);j++){
D hh=a[j][i]/a[i][i];
for(int k=i;k<=min(i+m,n*m);k++)
a[j][k]-=hh*a[i][k];
a[j][n*m+]-=hh*a[i][n*m+];
}
delete[] a[i];
if(i+m+<=n*m) newhh(i+m+);
}
D ans=a[n*m][n*m+]/a[n*m][n*m];
delete[] a[n*m];
printf("%.0lf\n",ans);
} int main(){
int cas; cin>>cas;
while(cas--) Main();
}
【xsy1201】 随机游走 高斯消元的更多相关文章
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...
- bzoj 3143: [Hnoi2013]游走 高斯消元
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1026 Solved: 448[Submit][Status] ...
- [HNOI2013][BZOJ3143] 游走 - 高斯消元
题目描述 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边 ...
- Luogu3232 HNOI2013 游走 高斯消元、期望、贪心
传送门 这种无向图上从一个点乱走到另一个点的期望题目好几道与高斯消元有关 首先一个显然的贪心:期望经过次数越多,分配到的权值就要越小. 设$du_i$表示$i$的度,$f_i$表示点$i$的期望经过次 ...
- 【BZOJ3143】【HNOI2013】游走 高斯消元
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3143 我们令$P_i$表示从第i号点出发的期望次数.则$P_n$显然为$0$. 对于$P ...
- BZOJ3143:[HNOI2013]游走(高斯消元)
Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...
- 【LOJ2542】【PKUWC 2018】随机游走 min-max容斥 树上高斯消元
题目描述 有一棵 \(n\) 个点的树.你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一 ...
- LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望
传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...
随机推荐
- 2018.07.31cogs2964. 数列操作η(线段树)
传送门 线段树基本操作. 给出一个排列b,有一个初始值都为0的数组a,维护区间加1,区间统计区间∑(ai/bi)" role="presentation" style=& ...
- 36 The Benefits of Marriage 结婚的益处
36 The Benefits of Marriage 结婚的益处 ①Being sociable looks like a good way to add years to your life.Re ...
- HDU 1061 Rightmost Digit (快速幂取模)
题意:给定一个数,求n^n的个位数. 析:很简单么,不就是快速幂么,取余10,所以不用说了,如果不会快速幂,这个题肯定是周期的, 找一下就OK了. 代码如下: #include <iostrea ...
- trmd_b1_ok
# -*- coding:utf-8 -*- ''' 从11c开始提取 ''' import re import numpy as np import os year = '17A' ss=" ...
- Windows环境下的安装gcc
Windows具有良好的界面和丰富的工具,所以目前linux开发的流程是,windows下完成编码工作,linux上实现编译工作. 为了提高工作效率,有必要在windows环境下搭建一套gcc,gdb ...
- C++ 11可变参数接口设计在模板编程中应用的一点点总结
概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...
- 用Execute操作数据库
1.原型是:_ConnectionPtr Execute( _bstr_t CommandText, VARIANT * RecordsAffected, long Options ); 参数 1. ...
- poj2462
看八戒在做这个题,我也做了做.. 坑很多,还是要注意细节.不得不吐槽,难道又到了计算几何只能套模板否则就一串WA的情况了么! 要不是八戒做出来了,这题我估计我也就扔到这里了..哥不服啊~所以得做出来! ...
- Java菜鸟学习笔记(23)--继承篇(二):继承与组合
组合是什么 1.继承和组合都是一种随思想渗透而下的编码方式,其根本目的都是为了复用类,减少重复代码 2.要实现一个类的复用,可以分为组合语法和继承语法 3.组合就是通过将一个对象置于一个新类中,将其作 ...
- Python学习-20.Python的Urllib模块
除了 Http 模块可以模拟 Http 请求外,使用 Urllib 模块也是可以模拟 Http 请求的,只不过功能相对弱一点. import urllib.request opener = urlli ...