码农题,拆点BFS预处理出所有联通块的面积即可,注意分类讨论。

  1. #include<cstdio>
  2. #include<cmath>
  3. using namespace std;
  4. const double pi=acos(-1.0)/4.0;
  5. const int N=210;
  6. struct P{int x,y,z;P(){}P(int _x,int _y,int _z){x=_x,y=_y,z=_z;}}q[N*N*2],p;
  7. int n,m,T,i,j,h,t,pos,c[N*N][3],v[N][N][3],a[N][N];char s[N];double sum[N*N],ans;
  8. void add(int x,int y,int z){
  9. if(!x||!y||x>n||y>m||v[x][y][z])return;
  10. v[x][y][z]=pos;
  11. c[pos][z]++;
  12. q[++t]=P(x,y,z);
  13. }
  14. void bfs(int x,int y,int z){
  15. h=1,t=0,add(x,y,z);
  16. while(h<=t){
  17. p=q[h++];
  18. if(!p.z){
  19. x=p.x-1,y=p.y;
  20. if(!a[x][y])add(x,y,0);
  21. if(a[x][y]==3||a[x][y]==4)add(x,y,1);
  22. if(a[x][y]==1||a[x][y]==2)add(x,y,2);
  23. x=p.x+1,y=p.y;
  24. if(!a[x][y])add(x,y,0);
  25. if(a[x][y]==1||a[x][y]==2)add(x,y,1);
  26. if(a[x][y]==3||a[x][y]==4)add(x,y,2);
  27. x=p.x,y=p.y-1;
  28. if(!a[x][y])add(x,y,0);
  29. if(a[x][y]==2||a[x][y]==3)add(x,y,1);
  30. if(a[x][y]==1||a[x][y]==4)add(x,y,2);
  31. x=p.x,y=p.y+1;
  32. if(!a[x][y])add(x,y,0);
  33. if(a[x][y]==1||a[x][y]==4)add(x,y,1);
  34. if(a[x][y]==2||a[x][y]==3)add(x,y,2);
  35. }
  36. if(p.z==1){
  37. if(a[p.x][p.y]==1){
  38. x=p.x-1,y=p.y;
  39. if(!a[x][y])add(x,y,0);
  40. if(a[x][y]==3||a[x][y]==4)add(x,y,1);
  41. if(a[x][y]==1||a[x][y]==2)add(x,y,2);
  42. x=p.x,y=p.y-1;
  43. if(!a[x][y])add(x,y,0);
  44. if(a[x][y]==2||a[x][y]==3)add(x,y,1);
  45. if(a[x][y]==1||a[x][y]==4)add(x,y,2);
  46. }
  47. if(a[p.x][p.y]==2){
  48. x=p.x-1,y=p.y;
  49. if(!a[x][y])add(x,y,0);
  50. if(a[x][y]==3||a[x][y]==4)add(x,y,1);
  51. if(a[x][y]==1||a[x][y]==2)add(x,y,2);
  52. x=p.x,y=p.y+1;
  53. if(!a[x][y])add(x,y,0);
  54. if(a[x][y]==1||a[x][y]==4)add(x,y,1);
  55. if(a[x][y]==2||a[x][y]==3)add(x,y,2);
  56. }
  57. if(a[p.x][p.y]==3){
  58. x=p.x+1,y=p.y;
  59. if(!a[x][y])add(x,y,0);
  60. if(a[x][y]==1||a[x][y]==2)add(x,y,1);
  61. if(a[x][y]==3||a[x][y]==4)add(x,y,2);
  62. x=p.x,y=p.y+1;
  63. if(!a[x][y])add(x,y,0);
  64. if(a[x][y]==1||a[x][y]==4)add(x,y,1);
  65. if(a[x][y]==2||a[x][y]==3)add(x,y,2);
  66. }
  67. if(a[p.x][p.y]==4){
  68. x=p.x+1,y=p.y;
  69. if(!a[x][y])add(x,y,0);
  70. if(a[x][y]==1||a[x][y]==2)add(x,y,1);
  71. if(a[x][y]==3||a[x][y]==4)add(x,y,2);
  72. x=p.x,y=p.y-1;
  73. if(!a[x][y])add(x,y,0);
  74. if(a[x][y]==2||a[x][y]==3)add(x,y,1);
  75. if(a[x][y]==1||a[x][y]==4)add(x,y,2);
  76. }
  77. }
  78. if(p.z==2){
  79. if(a[p.x][p.y]==1){
  80. x=p.x+1,y=p.y;
  81. if(!a[x][y])add(x,y,0);
  82. if(a[x][y]==1||a[x][y]==2)add(x,y,1);
  83. if(a[x][y]==3||a[x][y]==4)add(x,y,2);
  84. x=p.x,y=p.y+1;
  85. if(!a[x][y])add(x,y,0);
  86. if(a[x][y]==1||a[x][y]==4)add(x,y,1);
  87. if(a[x][y]==2||a[x][y]==3)add(x,y,2);
  88. }
  89. if(a[p.x][p.y]==2){
  90. x=p.x+1,y=p.y;
  91. if(!a[x][y])add(x,y,0);
  92. if(a[x][y]==1||a[x][y]==2)add(x,y,1);
  93. if(a[x][y]==3||a[x][y]==4)add(x,y,2);
  94. x=p.x,y=p.y-1;
  95. if(!a[x][y])add(x,y,0);
  96. if(a[x][y]==2||a[x][y]==3)add(x,y,1);
  97. if(a[x][y]==1||a[x][y]==4)add(x,y,2);
  98. }
  99. if(a[p.x][p.y]==3){
  100. x=p.x-1,y=p.y;
  101. if(!a[x][y])add(x,y,0);
  102. if(a[x][y]==3||a[x][y]==4)add(x,y,1);
  103. if(a[x][y]==1||a[x][y]==2)add(x,y,2);
  104. x=p.x,y=p.y-1;
  105. if(!a[x][y])add(x,y,0);
  106. if(a[x][y]==2||a[x][y]==3)add(x,y,1);
  107. if(a[x][y]==1||a[x][y]==4)add(x,y,2);
  108. }
  109. if(a[p.x][p.y]==4){
  110. x=p.x-1,y=p.y;
  111. if(!a[x][y])add(x,y,0);
  112. if(a[x][y]==3||a[x][y]==4)add(x,y,1);
  113. if(a[x][y]==1||a[x][y]==2)add(x,y,2);
  114. x=p.x,y=p.y+1;
  115. if(!a[x][y])add(x,y,0);
  116. if(a[x][y]==1||a[x][y]==4)add(x,y,1);
  117. if(a[x][y]==2||a[x][y]==3)add(x,y,2);
  118. }
  119. }
  120. }
  121. }
  122. int main(){
  123. scanf("%d%d",&n,&m);
  124. for(i=1;i<=n;i++){
  125. scanf("%s",s+1);
  126. for(j=1;j<=m;j++)if(s[j]=='0')a[i*2-1][j*2-1]=1,a[i*2][j*2]=3;
  127. else a[i*2-1][j*2]=2,a[i*2][j*2-1]=4;
  128. }
  129. n<<=1,m<<=1;
  130. for(i=1;i<=n;i++)for(j=1;j<=m;j++){
  131. if(!a[i][j]&&!v[i][j][0])++pos,bfs(i,j,0);
  132. if(a[i][j]&&!v[i][j][1])++pos,bfs(i,j,1);
  133. if(a[i][j]&&!v[i][j][2])++pos,bfs(i,j,2);
  134. }
  135. for(i=1;i<=pos;i++)sum[i]=c[i][0]+c[i][2]+(c[i][1]-c[i][2])*pi;
  136. scanf("%d",&T);
  137. while(T--){
  138. scanf("%d%d",&i,&j);
  139. if(a[i][j]==2||a[i][j]==4){puts("0.0000");continue;}
  140. if(a[i][j+1]==1||a[i][j+1]==3){puts("0.0000");continue;}
  141. if(a[i+1][j]==1||a[i+1][j]==3){puts("0.0000");continue;}
  142. if(a[i+1][j+1]==2||a[i+1][j+1]==4){puts("0.0000");continue;}
  143. if(!i&&!j){
  144. if(!a[1][1])ans=sum[v[1][1][0]];
  145. else if(a[1][1]==1)ans=sum[v[1][1][1]];
  146. else if(a[1][1]==3)ans=sum[v[1][1][2]];
  147. }else if(!i){
  148. if(!a[1][j])ans=sum[v[1][j][0]];
  149. else if(a[1][j]==2)ans=sum[v[1][j][1]];
  150. else if(a[1][j]==4)ans=sum[v[1][j][2]];
  151. }else if(!j){
  152. if(!a[i][1])ans=sum[v[i][1][0]];
  153. else if(a[i][1]==4)ans=sum[v[i][1][1]];
  154. else if(a[i][1]==2)ans=sum[v[i][1][2]];
  155. }else{
  156. if(!a[i][j])ans=sum[v[i][j][0]];
  157. else if(a[i][j]==3)ans=sum[v[i][j][1]];
  158. else if(a[i][j]==1)ans=sum[v[i][j][2]];
  159. }
  160. printf("%.4f\n",ans);
  161. }
  162. return 0;
  163. }

  

BZOJ3046 : lagoon的更多相关文章

  1. Cheap Hollister Clothing

    (link to hollisterco site), Spectacles don't simply take care of the eye area inside sun; Putting th ...

  2. 最有效地优化 Microsoft SQL Server 的性能

      为了最有效地优化 Microsoft SQL Server 的性能,您必须明确当情况不断变化时,性能将在哪些方面得到最大程度的改进,并集中分析这些方面.否则,在这些问题上您可能花费大量的时间和精力 ...

  3. [SinGuLaRiTy] Nescafe 24杯模拟赛

    [SinGularLaRiTy-1044] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 小水塘(lagoon) 题目描述 忘川沧月的小水塘 ...

  4. List of CentOS Mirrors

    From:https://www.centos.org/download/mirrors/ CentOS welcomes new mirror sites. If you are consideri ...

  5. 英语发音规则---字母组合oo的发音规律

    英语发音规则---字母组合oo的发音规律 一.总结 一句话总结:在英语单词中,字母组合oo多数读长音/u:/,少数读短音/ʊ/.另外,还有极少数的特殊情况读/ʌ/, 在英语单词中,字母组合oo多数读长 ...

  6. 英语发音规则---oo

    英语发音规则---oo 一.总结 一句话总结: 1.重读音节词尾的字母组合oo发音素[u:]的音? too [tu:] adv.太;也 zoo [zu:] n.动物园 room [ru:m] n.房间 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. 五、Pandas玩转数据

    Series的简单运算 import numpy as np import pandas as pd s1=pd.Series([1,2,3],index=['A','B','C']) print(s ...

  9. SFC游戏列表(维基百科)

    SFC游戏列表 日文名 中文译名 英文版名 发行日期 发行商 スーパーマリオワールド 超级马里奥世界 Super Mario World 1990年11月21日 任天堂 エフゼロ F-Zero F-Z ...

随机推荐

  1. Android 中4种屏幕尺寸

    具体信息,请参考 Android 官方文档 Supporting Multiple Screens small(屏幕尺寸小于3英寸左右的布局),  normal(屏幕尺寸小于4.5英寸左右), lar ...

  2. FastReport安装说明(中文版)

    FastReport安装说明(中文版) 内容列表 I. IntroductionI. 介绍II. Manual installing of the FastReport packagesII. 手动安 ...

  3. WPF 将PPT,Word转成图片

    在Office下,PowerPoint可以直接把每张幻灯片转成图片,而Word不能直接保存图片.所以只能通过先转换成xps文件,然后再转成图片. 一.PPT 保存为图片 /// <summary ...

  4. Intellij Idea无法从Controller跳转到视图页面的解决方案

    解决方案: 第一步,确认配置了Spring支持,如下图: 一般情况下,配置完上面就可以正常导航了,但是今天要说的不是一般情况,否则也就不说了,如果经过第一步设置后,还是不能正常导航的同学,可以接着看第 ...

  5. CodeForces - 420A (字符对称问题)

    Start Up Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Sta ...

  6. HDU 5651 xiaoxin juju needs help (组合数)

    xiaoxin juju needs helpTime Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64uSu ...

  7. Babelfish(poj 2503)

    大致题意: 输入一个字典,字典格式为“英语à外语”的一一映射关系 然后输入若干个外语单词,输出他们的 英语翻译单词,如果字典中不存在这个单词,则输出“eh” #include<iostream& ...

  8. 开启InnoDB每表一个独立的表空间

    mysql> show variables like '%innodb%'; +---------------------------------+----------------------- ...

  9. javascript栈的建立样码

    早上参加小孩的一年级入学前,看看相关的东东啦.. function Stack() { var items = []; this.push = function(element){ items.pus ...

  10. oracle的启动过程(不分模式启动)

    Oracle数据库的完整启动过程包含以下3个步骤: 简单地说,就是:启动实例-->加载数据库-->打开数据库. -------------------------------------- ...