有一个n*m的棋盘,上面有一些棋子,每行每列最多只会有一个棋子,不会有两个棋子八连通。问随机一个空格子作为起点,再随机地选择一个空格子作为终点,求问不经过任意棋子最短路的期望长度是多少。多组,n,m<=2000。

首先答案分子显然是所有点对距离之和,分母就是不是棋子的位置个数的平方。

假装没有棋子,那么距离就是曼哈顿距离了。那么我们可以考虑将x项和y项分开统计,所以只要按x、y坐标顺序枚举点即可。

现在有了棋子,我们考虑哪些东西会受到影响。

①同一行/同一列的被棋子隔开,这样肯定距离要加2。

②那不是同一行,同一列呢?

经过一番思考,我们可以发现对于一个蓝色位置的格子,只有红色位置的格子到这个点距离要加2。

我来解释一下...就是说首先要是连续的一串列都有障碍,然后障碍的位置还要是单调的。

这样我们就模拟一下就行了。似乎也不是特别难写。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define S 1004
int T,n,m,hang[S],lie[S];
typedef long long ll;
char cs[S][S];
void sol()
{
memset(hang,0,sizeof(hang));
memset(lie,0,sizeof(lie));
ll cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",cs[i]+1);
for(int j=1;j<=m;j++)
{
if(cs[i][j]=='G') hang[i]=j, lie[j]=i;
else ++cnt;
}
}
long long sum=0;
//hang
{
long long s=0,c=0;
for(int i=1;i<=n;i++)
{
long long cur=m-(bool)hang[i];
sum+=(i*c-s)*cur;
s+=i*cur; c+=cur;
}
}
//lie
{
long long s=0,c=0;
for(int j=1;j<=m;j++)
{
long long cur=n-(bool)lie[j];
sum+=(j*c-s)*cur;
s+=j*cur; c+=cur;
}
}
for(int i=1;i<=n;i++)
if(hang[i]) sum+=(hang[i]-1)*(ll)(m-hang[i])*2;
for(int i=1;i<=m;i++)
if(lie[i]) sum+=(lie[i]-1)*(ll)(n-lie[i])*2;
//hang
{
for(int s=0;s<=1;s++)
{
long long ss=0;
for(int i=1;i<=n;i++)
{
if(!hang[i]) {ss=0; continue;}
if(hang[i-1]&&(hang[i]>hang[i-1])==s)
sum+=ss*((!s)?(hang[i]-1):(m-hang[i]));
else
ss=0;
ss+=((s)?(hang[i]-1):(m-hang[i]))*2;
}
}
}
//lie
{
for(int s=0;s<=1;s++)
{
long long ss=0;
for(int i=1;i<=m;i++)
{
if(!lie[i]) {ss=0; continue;}
if(lie[i-1]&&(lie[i]>lie[i-1])==s)
sum+=ss*((!s)?(lie[i]-1):(n-lie[i]));
else
ss=0;
ss+=((s)?(lie[i]-1):(n-lie[i]))*2;
}
}
}
cnt*=cnt; sum*=2;
printf("%.4lf\n",sum/(double)cnt);
}
int main()
{
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
scanf("%d",&T);
while(T--) sol();
}

小Y的棋盘问题 题解的更多相关文章

  1. 【贪心】小Y的炮[cannon]题解

    模拟赛的题目,做的时候由于第二题表打太久了,只剩下40分钟,想都没想就写了一个爆搜20分... 这道题单调性很关键,下面会解释 P.S.解释在代码里 #include<cstdio> #i ...

  2. 【luogu P4007 清华集训2017】小Y和恐怖奴隶主

    题目背景 “A fight? Count me in!” 要打架了,算我一个. “Everyone, get in here!” 所有人,都过来! 题目描述 小 Y 是一个喜欢玩游戏的 OIer.一天 ...

  3. 【luoguP4006 清华集训2017】小Y和二叉树

    题目描述 小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型. 小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下 ...

  4. 【luogu P4005 清华集训2017】小Y和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

  5. BZOJ_4813_[Cqoi2017]小Q的棋盘_dfs

    BZOJ_4813_[Cqoi2017]小Q的棋盘_dfs Description 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能 在有连线的格 ...

  6. 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)

    [UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...

  7. 【BZOJ4813】[CQOI2017]小Q的棋盘(贪心)

    [BZOJ4813][CQOI2017]小Q的棋盘(贪心) 题面 BZOJ 洛谷 题解 果然是老年选手了,这种题都不会做了.... 先想想一个点如果被访问过只有两种情况,第一种是进入了这个点所在的子树 ...

  8. 【LOJ6089】小Y的背包计数问题(动态规划)

    [LOJ6089]小Y的背包计数问题(动态规划) 题面 LOJ 题解 神仙题啊. 我们分开考虑不同的物品,按照编号与\(\sqrt n\)的关系分类. 第一类:\(i\le \sqrt n\) 即需要 ...

  9. 【洛谷4005】小Y和地铁(搜索)

    [洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情 ...

随机推荐

  1. 停止运行ExecutorService中的线程

    while(true){ try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch bloc ...

  2. Android Activity生命周期详讲

    管理 Activity 生命周期 通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要. Activity 的生命周期会直接受到 Activity 与其他 Activit ...

  3. android 界面设计基本知识Ⅲ

    本章继续讲述在android界面设计中相关的知识点.介绍内容包括BroadcastReceiver(广播),Service(服务),Widget(小部件),WebView(网页加载控件). 1.Bro ...

  4. iOS 学习 - 10下载(2) NSURLSession 图片 篇

    使用NSURLSessionDownloadTask下载文件的过程与前面差不多,需要注意的是文件下载文件之后会自动保存到一个临时目录,需要开发人员自己将此文件重新放到其他指定的目录中. // // V ...

  5. Android点击空白处,隐藏软键盘

    在做登陆或者注册的时候,软键盘经常可能会挡住一些界面.我们需要在输入完成之后隐藏软键盘. 在我们点击空白处或者非EditText的地方来隐藏软键盘. public class HomeActivity ...

  6. JS、ActiveXObject、Scripting.FileSystemObject

    Javascript之文件操作 (IE) 一.功能实现核心:FileSystemObject 对象      要在javascript中实现文件操作功能,主要就是依靠FileSystemobject对 ...

  7. Struts

    Struts是基于MVC的框架,它进一步的对MVC进行了封装. MVC 概念 MVC全名是Model View Controller,是模型(model)—视图(view)—控制器(controlle ...

  8. flashdevelop生成swc库

    flashdevelop没有直接支持生成swc的工程,但flashdevelop生成swc也比较方便,不用任何插件. swc库是由 flexsdk的compc.exe生成的,其实我们通过这个命令行也可 ...

  9. WPF学习之路(十二)控件(Items控件)

     ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...

  10. AEAI DP按钮权限配置说明

    1 背景概述 AEAI DP3.5版本以后支持对按钮权限进行灵活的管理配置,本文对配置过程进行详细说明,为相关使用人员提供指导和参考. 2 预期读者 数通畅联技术人员 AEAI DP开发平台使用人员 ...