从$(0,0)$开始BFS$2\times10^6$步,那么迷宫的形状有三种:

1.走不完$2\times10^6$步,直接判定即可。

2.可以走到$(n,0)$以及$(0,m)$,那么直接把询问点平移到一开始的小迷宫里即可。

3.可以沿着$(dx,dy)$这个向量达到某些左上角,那么先三分沿向量走的步数,把询问点平移到最近距离之后再判定。

#include<cstdio>
typedef long long ll;
const int N=105,M=2000010,U=(1<<24)-1;
int n,m,_,flag,dx,dy,i,j,x,y,h=1,t,q[M][2];char a[N][N];
struct E{int x,y;E*nxt;}*g[U+1],pool[M],*cur=pool,*p;
inline void read(int&a){
char c;bool f=0;a=0;
while(!((((c=getchar())>='0')&&(c<='9'))||(c=='-')));
if(c!='-')a=c-'0';else f=1;
while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';
if(f)a=-a;
}
inline void ins(int x,int y){
int u=((x<<9)^y)&U;
p=cur++;p->x=x;p->y=y;p->nxt=g[u];g[u]=p;
}
inline bool ask(int x,int y){
for(p=g[((x<<9)^y)&U];p;p=p->nxt)if(p->x==x&&p->y==y)return 1;
return 0;
}
inline int pos(int x,int n){return (x%n+n)%n;}
inline void ext(int x,int y){
if(t==M-1)return;
if(!a[pos(x,n)][pos(y,m)])return;
if(ask(x,y))return;
q[++t][0]=x;q[t][1]=y;ins(x,y);
}
inline ll abs(ll x){return x>0?x:-x;}
inline ll dis(int x,int y,ll k){return abs(k*dx+x)+abs(k*dy+y);}
inline bool query(int x,int y){
if(t<M-1)return ask(x,y);
if(flag)return ask(pos(x,n),pos(y,m));
ll l=-1000000000,r=1000000000;
while(l+5<r){
ll len=(r-l)/3,m1=l+len,m2=r-len;
if(dis(x,y,m1)<dis(x,y,m2))r=m2;else l=m1;
}
for(;l<=r;l++)if(dis(x,y,l)<=M)if(ask(l*dx+x,l*dy+y))return 1;
return 0;
}
int main(){
read(n),read(m);
for(i=0;i<n;i++)for(scanf("%s",a[i]),j=0;j<m;j++)a[i][j]=a[i][j]=='.';
ext(0,0);
while(h<=t){
x=q[h][0];y=q[h++][1];
ext(x-1,y);
ext(x+1,y);
ext(x,y-1);
ext(x,y+1);
}
if(t==M-1){
if(ask(n,0)&&ask(0,m))flag=1;else for(i=2;i<=t;i++){
x=q[i][0],y=q[i][1];
if(x%n||y%m)continue;
dx=x,dy=y;
break;
}
}
read(_);
while(_--)read(x),read(y),puts(query(x,y)?"yes":"no");
return 0;
}

  

最新文章

  1. MyBatis基础入门--知识点总结
  2. 与你相遇好幸运,用sinopia搭建npm私服
  3. 用 perl 统计 fasta 文件序列的总长
  4. phpspec安装配置
  5. 关于基于.NET Framework的网络通信程序底层扫盲
  6. poj 2348
  7. Eclipse输入任意字母或指定字符出现提示框
  8. Java编程思想读书笔记--第21章并发
  9. svn恢复到之前某个版本号
  10. [置顶] 初识window.location.search
  11. JS于string 和 json互转对象
  12. LInq 与lambda表达式
  13. ios学习笔记之UIControl解读
  14. Delphi制作图像特殊显示效果
  15. Ionic如何实现单选二级菜单切换
  16. UITableView的性能优化1
  17. ECMA Script 6_模块加载方案 ES6 Module 模块语法_import_export
  18. python selenium-webdriver 定位frame中的元素 (十三)
  19. what&#39;s the python之面向对象
  20. 链接(跳转)&lt;router-link&gt; 和 路由实例Router

热门文章

  1. tensorflow:验证码的识别(中)
  2. 使用python调用shell判断当前进程是否存在
  3. 封装cuda/cudnn写卷积网络前向计算程序
  4. 小改造gotty,使之适合接收经过一层加密的URL
  5. FormsAuthenticationTicket
  6. 【Maven】Select Dependency 无法检索
  7. Linux(CentOS7)安装Tomcat
  8. [转]centos安装autossh
  9. Flink--将表转换为DataStream或DataSet
  10. IDEA学习——模板及其常用模板