【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 ...
随机推荐
- android触控,先了解MotionEvent(一)
http://my.oschina.net/banxi/blog/56421 这是我个人的看法,要学好android触控,了解MotionEvent是必要,对所用的MotionEvent常用的API要 ...
- 如何配置JDK?
有很多人,java都下载好,却因不会配置JDK,而无法编程.今天巩固就来教大家配置JDK. 第一步:将下载好的java放在D盘(最好不要占用C盘). 第二步:右击我的电脑,选择"属性 ...
- java Exception 出错的栈信息打印到日志中 打印堆栈信息
我们在开发程序的过程当中,日志是必不可少的工具,这有助于我们分析问题的原因,和出错的详细信息,而java的异常机制又会方便且迅速的帮我们找到出错行的位置. try { .... } catch (Ex ...
- python 爬虫括号的用法
首先是文档说明: >>> import re >>> help(re.findall) Help on function findall in module re: ...
- 20155236 2016-2017-2 《Java程序设计》第七周学习总结
20155236 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 Calendar是个抽象类,java.util.GregorianCalendar是其子类, ...
- 20155302 2016-2017-2 《Java程序设计》第六周学习总结
20155302 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入 ...
- Python学习-4.Python的模块加载(二)
1.部分函数加载 from SameFolder import printSameFolder printSameFolder() 该代码指从SameFolder.py中加载printSameFold ...
- linux新定时器:timefd及相关操作函数
timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...
- BlangenOA项目总结
1.使用EF,当返回的是IQueryable<T>类型,延迟加载. 2.增删改查 分页(页码,页大小,总记录数,是否升序)(两个lambda表达式,一个筛选规则,一个是排序规则(可以选择类 ...
- js 利用数组实现类似于asp中的数据字典
---恢复内容开始--- 首先声明一个数组 var dictNew=new Array; var key; var value; for (var i = 0; i <50; i++) { // ...