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

#include<cstdio>
#include<cmath>
using namespace std;
const double pi=acos(-1.0)/4.0;
const int N=210;
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;
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;
void add(int x,int y,int z){
if(!x||!y||x>n||y>m||v[x][y][z])return;
v[x][y][z]=pos;
c[pos][z]++;
q[++t]=P(x,y,z);
}
void bfs(int x,int y,int z){
h=1,t=0,add(x,y,z);
while(h<=t){
p=q[h++];
if(!p.z){
x=p.x-1,y=p.y;
if(!a[x][y])add(x,y,0);
if(a[x][y]==3||a[x][y]==4)add(x,y,1);
if(a[x][y]==1||a[x][y]==2)add(x,y,2);
x=p.x+1,y=p.y;
if(!a[x][y])add(x,y,0);
if(a[x][y]==1||a[x][y]==2)add(x,y,1);
if(a[x][y]==3||a[x][y]==4)add(x,y,2);
x=p.x,y=p.y-1;
if(!a[x][y])add(x,y,0);
if(a[x][y]==2||a[x][y]==3)add(x,y,1);
if(a[x][y]==1||a[x][y]==4)add(x,y,2);
x=p.x,y=p.y+1;
if(!a[x][y])add(x,y,0);
if(a[x][y]==1||a[x][y]==4)add(x,y,1);
if(a[x][y]==2||a[x][y]==3)add(x,y,2);
}
if(p.z==1){
if(a[p.x][p.y]==1){
x=p.x-1,y=p.y;
if(!a[x][y])add(x,y,0);
if(a[x][y]==3||a[x][y]==4)add(x,y,1);
if(a[x][y]==1||a[x][y]==2)add(x,y,2);
x=p.x,y=p.y-1;
if(!a[x][y])add(x,y,0);
if(a[x][y]==2||a[x][y]==3)add(x,y,1);
if(a[x][y]==1||a[x][y]==4)add(x,y,2);
}
if(a[p.x][p.y]==2){
x=p.x-1,y=p.y;
if(!a[x][y])add(x,y,0);
if(a[x][y]==3||a[x][y]==4)add(x,y,1);
if(a[x][y]==1||a[x][y]==2)add(x,y,2);
x=p.x,y=p.y+1;
if(!a[x][y])add(x,y,0);
if(a[x][y]==1||a[x][y]==4)add(x,y,1);
if(a[x][y]==2||a[x][y]==3)add(x,y,2);
}
if(a[p.x][p.y]==3){
x=p.x+1,y=p.y;
if(!a[x][y])add(x,y,0);
if(a[x][y]==1||a[x][y]==2)add(x,y,1);
if(a[x][y]==3||a[x][y]==4)add(x,y,2);
x=p.x,y=p.y+1;
if(!a[x][y])add(x,y,0);
if(a[x][y]==1||a[x][y]==4)add(x,y,1);
if(a[x][y]==2||a[x][y]==3)add(x,y,2);
}
if(a[p.x][p.y]==4){
x=p.x+1,y=p.y;
if(!a[x][y])add(x,y,0);
if(a[x][y]==1||a[x][y]==2)add(x,y,1);
if(a[x][y]==3||a[x][y]==4)add(x,y,2);
x=p.x,y=p.y-1;
if(!a[x][y])add(x,y,0);
if(a[x][y]==2||a[x][y]==3)add(x,y,1);
if(a[x][y]==1||a[x][y]==4)add(x,y,2);
}
}
if(p.z==2){
if(a[p.x][p.y]==1){
x=p.x+1,y=p.y;
if(!a[x][y])add(x,y,0);
if(a[x][y]==1||a[x][y]==2)add(x,y,1);
if(a[x][y]==3||a[x][y]==4)add(x,y,2);
x=p.x,y=p.y+1;
if(!a[x][y])add(x,y,0);
if(a[x][y]==1||a[x][y]==4)add(x,y,1);
if(a[x][y]==2||a[x][y]==3)add(x,y,2);
}
if(a[p.x][p.y]==2){
x=p.x+1,y=p.y;
if(!a[x][y])add(x,y,0);
if(a[x][y]==1||a[x][y]==2)add(x,y,1);
if(a[x][y]==3||a[x][y]==4)add(x,y,2);
x=p.x,y=p.y-1;
if(!a[x][y])add(x,y,0);
if(a[x][y]==2||a[x][y]==3)add(x,y,1);
if(a[x][y]==1||a[x][y]==4)add(x,y,2);
}
if(a[p.x][p.y]==3){
x=p.x-1,y=p.y;
if(!a[x][y])add(x,y,0);
if(a[x][y]==3||a[x][y]==4)add(x,y,1);
if(a[x][y]==1||a[x][y]==2)add(x,y,2);
x=p.x,y=p.y-1;
if(!a[x][y])add(x,y,0);
if(a[x][y]==2||a[x][y]==3)add(x,y,1);
if(a[x][y]==1||a[x][y]==4)add(x,y,2);
}
if(a[p.x][p.y]==4){
x=p.x-1,y=p.y;
if(!a[x][y])add(x,y,0);
if(a[x][y]==3||a[x][y]==4)add(x,y,1);
if(a[x][y]==1||a[x][y]==2)add(x,y,2);
x=p.x,y=p.y+1;
if(!a[x][y])add(x,y,0);
if(a[x][y]==1||a[x][y]==4)add(x,y,1);
if(a[x][y]==2||a[x][y]==3)add(x,y,2);
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%s",s+1);
for(j=1;j<=m;j++)if(s[j]=='0')a[i*2-1][j*2-1]=1,a[i*2][j*2]=3;
else a[i*2-1][j*2]=2,a[i*2][j*2-1]=4;
}
n<<=1,m<<=1;
for(i=1;i<=n;i++)for(j=1;j<=m;j++){
if(!a[i][j]&&!v[i][j][0])++pos,bfs(i,j,0);
if(a[i][j]&&!v[i][j][1])++pos,bfs(i,j,1);
if(a[i][j]&&!v[i][j][2])++pos,bfs(i,j,2);
}
for(i=1;i<=pos;i++)sum[i]=c[i][0]+c[i][2]+(c[i][1]-c[i][2])*pi;
scanf("%d",&T);
while(T--){
scanf("%d%d",&i,&j);
if(a[i][j]==2||a[i][j]==4){puts("0.0000");continue;}
if(a[i][j+1]==1||a[i][j+1]==3){puts("0.0000");continue;}
if(a[i+1][j]==1||a[i+1][j]==3){puts("0.0000");continue;}
if(a[i+1][j+1]==2||a[i+1][j+1]==4){puts("0.0000");continue;}
if(!i&&!j){
if(!a[1][1])ans=sum[v[1][1][0]];
else if(a[1][1]==1)ans=sum[v[1][1][1]];
else if(a[1][1]==3)ans=sum[v[1][1][2]];
}else if(!i){
if(!a[1][j])ans=sum[v[1][j][0]];
else if(a[1][j]==2)ans=sum[v[1][j][1]];
else if(a[1][j]==4)ans=sum[v[1][j][2]];
}else if(!j){
if(!a[i][1])ans=sum[v[i][1][0]];
else if(a[i][1]==4)ans=sum[v[i][1][1]];
else if(a[i][1]==2)ans=sum[v[i][1][2]];
}else{
if(!a[i][j])ans=sum[v[i][j][0]];
else if(a[i][j]==3)ans=sum[v[i][j][1]];
else if(a[i][j]==1)ans=sum[v[i][j][2]];
}
printf("%.4f\n",ans);
}
return 0;
}

  

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. [BZOJ2303][Apio2011]方格染色

    [BZOJ2303][Apio2011]方格染色 试题描述 Sam和他的妹妹Sara有一个包含n × m个方格的 表格.她们想要将其的每个方格都染成红色或蓝色. 出于个人喜好,他们想要表格中每个2 × ...

  2. ubuntu 修改保存报错E37:No write since last change(add ! to override)的解决方法

    报错信息如下: E37: No write since last change (add ! to override) 解决办法是: 在修改完后,将命令 :q 改成 :wq 即可.

  3. mysql中int、bigint、smallint 和 tinyint的区别与长度的含义

    最近使用mysql数据库的时候遇到了多种数字的类型,主要有int,bigint,smallint和tinyint.其中比较迷惑的是int和smallint的差别.今天就在网上仔细找了找,找到如下内容, ...

  4. c++关键字之#define typedef const

    [#define] #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查. [typedef] typedef只是为了增加可读性而为标识符另起的新名称 在自己的作用域内给一个已经存 ...

  5. swift 中delegate的使用

    今天写了delegate,遇到以下问题: 这里protocol的写法有问题,如果delegate指向一个实现了某个协议对象的引用,在oc里是这样写delegate的类型 id<protocol& ...

  6. Python多线程(2)——线程同步机制

    本文介绍Python中的线程同步对象,主要涉及 thread 和 threading 模块. threading 模块提供的线程同步原语包括:Lock.RLock.Condition.Event.Se ...

  7. Java for LeetCode 201 Bitwise AND of Numbers Range

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  8. BaseServlet方法分发

    BaseServlet.java package org.guangsoft.controller; import java.io.IOException; import java.lang.refl ...

  9. Linux用户名显示-bash-4.1$快速排查

    最近项目使用的的服务器有点多(100多台),很多开发同事经常问这个问题,现在整理如下: 几个可能导致的原因: 1 用户的家目录所属组被改为root,解决方法使用root执行cd /home/;chow ...

  10. Eclipse 中Tomcat 启动 与直接启动Tomcat的区别

    这段时间不用Java 了突然发现在用的时候出问题了. 首先现在Eclipse和Tomcat,解压后 如图1所示: 图1: 进入里面的bin文件目录后发现有 如图2所示包含了startup.bat,st ...