HDU 5725 Game
1. 笔记
题意是求距离的期望(距离仍指连接两点且有效的路径长度的最小值)。直观想象可以发现,该距离与曼哈顿距离相比最多多2(可以构造这样的路径)。
答案=(任意两点曼哈顿距离的总和 - 至少有一点是守卫的距离总和 + 因守卫的存在比曼哈顿距离多出的部分)/(任选两点均不是守卫的情况数)
任意两点曼哈顿距离的总和
=\(\frac{mn(m+n)(mn-1)}{3}\),O(1)
至少有一点是守卫的距离总和
:临时跑,O(n^2)
任选两点均不是守卫的情况数
=非守卫点数^2,O(1)
比较tricky的是因守卫的存在比曼哈顿距离多出的部分
。通过简单的实验可以得到这样一个猜想(实际上也是正确的):如果从左上走到右下,比如说从第一排第一列走到第n排第m列,那么需要绕路的必要条件是守卫的列数随着排数的增加而增加。证明如下:
设前k-1排都满足“守卫的列数随着排数的增加而增加”的性质,而第k排不满足,其中k>1。不难发现,一定可以从起点(1,1)走到第k排守卫的右侧一位(k,r)而不绕路(记(k,r)表示第k排第r列)。Claim:(k,r)开始走到终点也是不绕路的。要证明这一点,只要对列数从m到r做归纳,得出结论:从(k,r)走到终点(n,m)需要绕路,当且仅当长方形区域(k,r)-(n,m)内的每一列都必须有守卫,并且守卫的排布满足“守卫的列数随着排数的增加而增加”的性质。但这是不可能的,因为必有一个守卫会和前k-1排的某个守卫位于同一列。#
由此可以得出绕路的充要条件 ( 还是从左上走到右下):要么每一排、要么每一列都有一个守卫,并且守卫的排布满足“守卫的列数随排数的增加而增加”的性质。证明如下:
若第一排第一列都有守卫,由必要条件知,不需要绕路。若第一排或第一列有一个为空,则由必要条件的证明知,守卫的排布必满足上述性质。逆命题是显然的。#
实现时只要考虑满足“绕路性质”的守卫让多少条路径绕路即可。O(n^2)
总复杂度为O(n^2)。可以通过。
2. 代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
typedef long long ll;
int m,n;
ll a,b,c,d;
int l[maxn],r[maxn];
int main()
{
//freopen("Input.txt","r",stdin);
int T;scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(l,0,sizeof l);memset(r,0,sizeof r);
char tmp[maxn];
int cnt=0;
//printf("Input:\n");
for(int i=1;i<=n;++i)
{
scanf("%s",tmp);
for(int j=0;j<m;++j)if(tmp[j]=='G'){l[i]=j+1;r[j+1]=i;cnt++;}
}
//printf("End\n");
a=1LL*m*n*(m+n)*(m*n-1)/3;
d=1LL*(m*n-cnt)*(m*n-cnt);
b=0;
for(int i=1;i<=n;++i)
{
if(l[i])b+=1LL*m*n*n-2*m*n*i+2*m*i*i+m*n-2*m*i+n*m*m-2*m*n*l[i]+2*n*l[i]*l[i]+m*n-2*n*l[i];
}
//printf("b=%d\n",b);
for(int i=1;i<=n;++i)
{
if(l[i])
{
for(int j=i+1;j<=n;++j)
{
if(l[j])b-=2*abs(i-j)+2*abs(l[i]-l[j]);
}
}
}
c=0;
for(int i=1;i<=n;++i)
{
if(l[i]==0)continue;
c+=4*(l[i]-1)*(m-l[i]);
int j=i+1;
while(j<=n&&l[j]&&l[j]>l[j-1])c+=4*(l[i]-1)*(m-l[j++]);
j=i+1;
while(j<=n&&l[j]&&l[j]<l[j-1])c+=4*(l[j++]-1)*(m-l[i]);
//printf("i=%d,c=%d\n",i,c);
}
for(int i=1;i<=m;++i)
{
if(r[i]==0)continue;
c+=4*(r[i]-1)*(n-r[i]);
int j=i+1;
while(j<=m&&r[j]&&r[j]>r[j-1])c+=4*(r[i]-1)*(n-r[j++]);
j=i+1;
while(j<=m&&r[j]&&r[j]<r[j-1])c+=4*(r[j++]-1)*(n-r[i]);
//printf("j=%d,c=%d\n",i,c);
}
double ans=a-b+c;
ans/=d;
printf("%.4f\n",ans);
}
}
HDU 5725 Game的更多相关文章
- hdu 3631 Shortest Path(Floyd)
题目链接:pid=3631" style="font-size:18px">http://acm.hdu.edu.cn/showproblem.php?pid=36 ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
- hdu 4859 海岸线 Bestcoder Round 1
http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...
- HDU 4569 Special equations(取模)
Special equations Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- HDU 4006The kth great number(K大数 +小顶堆)
The kth great number Time Limit:1000MS Memory Limit:65768KB 64bit IO Format:%I64d & %I64 ...
- HDU 1796How many integers can you find(容斥原理)
How many integers can you find Time Limit:5000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 3791二叉搜索树解题(解题报告)
1.题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3791 2.参考解题 http://blog.csdn.net/u013447865/articl ...
随机推荐
- F - 我们什么时候能见面? POJ - 2028
F - 我们什么时候能见面? POJ - 2028 ICPC委员会希望尽快召开会议,解决下一届比赛中的每一个小问题.然而,委员会的成员都忙于疯狂地开发(可能是无用的)程序,以至于很难安排他们的会议日程 ...
- 如何让Java应用成为杀不死的小强?(上篇)
各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 项庄舞剑意在沛公,而咱们上期主要借助应用服务器 Resin 的源码,体验了一次 JMX 的真实应用.鉴于 9012 年 ...
- 云计算介绍、TCP/IP协议及配置
云计算介绍.TCP/IP协议及配置 1案例1:配置计算机名及工作组 1.1问题 本例要求为修改计算机名并加入工 ...
- 【PHP】数组
一.生活中的数组: a) 教室的座位:第一天来教室的时候,每个座位上都有自己的一个名字,我们可以通过这个名字快速定位到自己的座位在什么位置! b) 电影院的座位:我们买了电影票之后,能够通 ...
- (js描述的)数据结构 [数组的一些补充](1)
(js描述的)数据结构 [数组的一些补充](1) 1. js的数组: 1.优点:高度封装,对于数组的操作就是调用API 2.普通语言的数组: 1.优点:根据index来查询,修改数据效率很高 2.缺点 ...
- 计算机网络协议,PPP协议分析
一.基本特点 1.PPP协议是计算机网络体系中第二层(数据链路层)的协议 2.PPP帧格式是以HDLC帧格式为基础,做了很少的改动(区别:PPP是面向字符的,而HDLC是面向位的) 3.PPP协议使用 ...
- Linux学习,账号管理与权限管理
linux系统本来不认识账号,只是通过UID(用户ID)和GID(所属组ID)来区分账号属性的.而这对应的目录如下: UID ===> /etc/passwd GID ===> /etc/ ...
- 汇编刷题:屏幕显示 HOW ARE YOU!
DATA SEGMENT INFO DB 'HOW ARE YOU!$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DAT ...
- Array(数组)对象-->indexOf() 方法
1.定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置,即下标. 如果没有找到匹配的字符串则返回 -1. 语法: string.indexOf(searchvalue ...
- ln -s 软链接命令
所有对软链接link_name的操作都是对目录或文件dir_file的操作 ln -s [dir_file] [link_name]