2016 Multi-University Training Contest 1 T3
2016-07-21 12:00
477 查看
题目要求出所有合法点对间的最短路径的平均值,因此我们应当求出所有合法最短点对的最 短路径之和,再除以合法点对个数。
题目中Guard之间有着很不自然的制约关系,每个Guard的周围和同行、列都不能有其余的 Guard,但不可路过的格子却只有本身一格。由此发现,任意两点间的最短路径只会至多被 一个Guard所干扰。
我们可以先算出没有Guard制约的所有最短路径长度之和,再分别对于每个 Guard求出必须经过他的点对个数,原本必须经过它的最短路要多绕两格。
对于第i行每个#点,他对于上面第j行的每个#点在纵坐标路径长度的贡献是abs(i-j),列也一样。然后就可以o(n*m)的算出路径和。
对于G点,和他在同一列的和不同列的可以分开算。
View Code
题目中Guard之间有着很不自然的制约关系,每个Guard的周围和同行、列都不能有其余的 Guard,但不可路过的格子却只有本身一格。由此发现,任意两点间的最短路径只会至多被 一个Guard所干扰。
我们可以先算出没有Guard制约的所有最短路径长度之和,再分别对于每个 Guard求出必须经过他的点对个数,原本必须经过它的最短路要多绕两格。
对于第i行每个#点,他对于上面第j行的每个#点在纵坐标路径长度的贡献是abs(i-j),列也一样。然后就可以o(n*m)的算出路径和。
对于G点,和他在同一列的和不同列的可以分开算。
#include<cstring> #include<cstdio> #define mem(a) memset(a,0,sizeof(a)) int gl[1100],gh[1100],_,i,j,n,m; double x,sum,ans,numl[1100],numh[1100],p; char c[1100][1100]; int main() { //freopen("1.in","r",stdin); freopen("1.out","w",stdout); scanf("%d",&_); while (_--) { sum=0; mem(numh);mem(numl);mem(gl);mem(gh); scanf("%d%d",&n,&m); for (i=1;i<=n;i++) { scanf("%s",c[i]+1); for (j=1;j<=m;j++) { if (c[i][j]=='#') { sum+=1; numl[j]+=1; numh[i]+=1; } else { gl[j]=i; gh[i]=j; } } } ans=0;sum=sum*sum; for (i=1;i<=n;i++) { for (j=1;j<i;j++) { x=(i-j)*numh[j]/sum; ans+=x*numh[i]; } for (j=i+1;j<=m;j++) { x=(j-i)*numh[j]/sum; ans+=x*numh[i]; } } for (i=1;i<=m;i++) { for (j=1;j<i;j++) { x=(i-j)*numl[j]/sum; ans+=x*numl[i]; } for (j=i+1;j<=m;j++) { x=(j-i)*numl[j]/sum; ans+=x*numl[i]; } } for (i=1;i<=n;i++) for (j=1;j<=m;j++) if(c[i][j]=='G') ans+=((i-1)*(n-i)*4+(j-1)*(m-j)*4)/sum; for (j=2;j<=n;j++){ if (gh[j-1]==0 || gh[j]==0) continue; if (gh[j-1]<gh[j]){ p=(gh[j-1]-1)*(m-gh[j])/sum; for (i=j-2;i>0;i--){ if (gh[i]==0 || gh[i]>gh[i+1]) break; p+=1.0*(gh[i]-1)*(m-gh[j])/sum; } }else { p=(m-gh[j-1])*(gh[j]-1)/sum; for (i=j-2;i>0;i--){ if (gh[i]==0 || gh[i]<gh[i+1]) break; p+=(m-gh[i])*(gh[j]-1)/sum; } } ans+=4.0*p; } for (j=2;j<=m;j++){ if (gl[j-1]==0 || gl[j]==0) continue; if (gl[j-1]<gl[j]){ p=(gl[j-1]-1)*(n-gl[j])/sum; for (i=j-2;i>0;i--){ if (gl[i]==0 || gl[i]>gl[i+1]) break; p+=(gl[i]-1)*(n-gl[j])/sum; } }else { p=(n-gl[j-1])*(gl[j]-1)/sum; for (i=j-2;i>0;i--){ if (gl[i]==0 || gl[i]<gl[i+1]) break; p+=(n-gl[i])*(gl[j]-1)/sum; } } ans+=4.0*p; } printf("%.4f\n",ans); } return 0; }
View Code
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
17652872 | 2016-07-20 19:02:27 | Accepted | 5725 | 717MS | 2528K | 2012 B | G++ | lbz007 |
相关文章推荐
- Error:Execution failed for task ':pulltorefreshlibrary:processReleaseResources'.
- how to send mail from 3rd
- Web container
- 17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标:
- 17.1.1.4 Obtaining the Replication Master Binary Log Coordinates 获取复制Master Binary Log的坐标:
- rails常用的验证
- R install packages InternetOpenUrl failed: ''
- 2016 Multi-University Training Contest 1-1005---HDU 5727 Necklace(枚举+二分图匹配)
- opencv-图像修补,图像修复,inpaint
- BIO NIO AIO实例
- postal邮件发送(二):Email headers,附件,图片介绍
- 报错:Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canva
- hdoj2057A + B Again(字符串)
- INSTALL_FAILED_SHARED_USER_INCOMPATIBLE while using shared user id
- waitpid()
- wait()函数详解
- sleep与 wait区别
- sys/wait.h
- explain详细说明
- [Cloud Computing]Mechanisms: RAID-level Identifier